PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jak grupować według miesiąca w PostgreSQL

Problem:

Chcesz pogrupować rekordy według miesiąca w bazie danych PostgreSQL.

Przykład:

Nasza baza danych zawiera tabelę o nazwie watch z danymi w kolumnach id , name i production_timestamp .

id imię product_timestamp
1 oglądaj 2019-03-01 11:45:23
2 smartwatch 2019-09-15 07:35:13
3 inteligentna opaska 2019-09-22 17:22:05

Rozwiązanie:

Możesz użyć DATE_TRUNC() funkcja grupowania rekordów w tabeli według miesiąca.

Oto zapytanie, które możesz napisać:

SELECT 
       DATE_TRUNC('month',production_timestamp)
         AS  production_to_month,
       COUNT(id) AS count 
FROM watch
GROUP BY DATE_TRUNC('month',production_timestamp);

Oto wynik zapytania:

produkcja_do_miesiąca liczba
2019-03-01 00:00:00 1
2019-09-01 00:00:00 2

Dyskusja:

Użyj DATE_TRUNC() funkcja, jeśli chcesz pobrać datę lub godzinę z określoną precyzją z bazy danych PostgreSQL. (W naszym przykładzie użyliśmy dokładności miesięcznej).

Ta funkcja przyjmuje dwa argumenty. Najpierw mamy specyfikator części daty (w naszym przykładzie „miesiąc”). Zauważ, że specyfikator jest łańcuchem i musi być ujęty w cudzysłów.

Drugi argument to wartość znacznika czasu; może to być wyrażenie zwracające wartość znacznika czasu lub nazwę kolumny znacznika czasu. (W naszym przykładzie używamy kolumny production_timestamp ).

Funkcja DATE_TRUNC() obcina znacznik czasu do określonej precyzji (w tym przypadku miesiąca). W naszej bazie danych smartwatch ma datę produkcji 2019-09-15 07:35:13; po skróceniu do dokładności miesięcznej staje się 2019-09-01 00:00:00 . Dokładność na poziomie miesiąca powoduje, że dzień jest wyświetlany jako „01”, a czas jest wypełniony zerami. (Obcięte części daty (np. dni, miesiące) znacznika czasu są zastępowane jedynkami.)

Grupowanie rekordów według miesiąca jest bardzo powszechne w PostgreSQL. W naszym przykładzie liczba produktów jest sumowana w każdym miesiącu. (COUNT() funkcja agregująca zlicza liczbę produktów). Jeśli grupujesz rekordy za pomocą funkcji agregującej, musisz użyć klauzuli GROUP BY. Po klauzuli GROUP BY należy umieścić kolumny lub wyrażenia używane z funkcją agregującą w instrukcji SELECT. (W naszym przykładzie jest to DATE_TRUNC( 'month', production_timestamp) .)

Oczywiście nie musisz używać DATE_TRUNC() funkcja tylko do grupowania rekordów. Możesz go również użyć, aby uzyskać pierwszy dzień miesiąca dla danego dnia.

Dla każdego zegarka podajmy nazwę i datę produkcji z dokładnością do miesiąca – bez konieczności grupowania. Oto zapytanie, które możesz napisać:

SELECT name,
       DATE_TRUNC('month',production_timestamp)
         AS  production_to_month
FROM watch;

Oto wynik:

nazwa produkcja_do_miesiąca
oglądaj 2019-03-01 00:00:00
smartwatch 2019-09-01 00:00:00
inteligentna opaska 2019-09-01 00:00:00

W tym zapytaniu funkcja DATE_TRUNC() obcina sygnaturę czasową do dokładności miesiąca. W naszej bazie danych smartwatch ma datę produkcji '2019-09-15 07:35:13'; teraz to '2019-09-01 00:00:00' , czyli pierwszy dzień miesiąca.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak zwrócić tylko czas pracy z rezerwacji w PostgreSql?

  2. Zapytanie PostgreSQL do zwrócenia wyników w postaci listy oddzielonej przecinkami

  3. Jak uzyskać tekst SQL z wyzwalacza zdarzenia Postgres?

  4. PostgreSQL – jak wyeliminować powtarzające się wartości

  5. Migracja istniejących danych auth.User do nowego niestandardowego modelu użytkownika Django 1.5?