PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Come raggruppare per mese in PostgreSQL

Problema:

Vorresti raggruppare i record per mese in un database PostgreSQL.

Esempio:

Il nostro database ha una tabella chiamata watch con i dati nelle colonne id , name e production_timestamp .

id timestamp_produzione
1 guarda 2019-03-01 11:45:23
2 smartwatch 15-09-2019 07:35:13
3 smartband 22-09-2019 17:22:05

Soluzione:

Puoi usare il DATE_TRUNC() funzione per raggruppare i record in una tabella per mese.

Ecco la domanda che scriveresti:

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

Ecco il risultato della query:

produzione_al_mese conta
01-03-2019 00:00:00 1
01-09-2019 00:00:00 2

Discussione:

Usa il DATE_TRUNC() funzione se si desidera recuperare una data o un'ora con una precisione specifica da un database PostgreSQL. (Nel nostro esempio, abbiamo utilizzato la precisione del mese.)

Questa funzione accetta due argomenti. Innanzitutto, abbiamo l'identificatore della parte della data (nel nostro esempio, 'mese'). Si noti che lo specificatore è una stringa e deve essere racchiuso tra virgolette.

Il secondo argomento è il valore del timestamp; può essere un'espressione che restituisce un valore di timestamp o il nome di una colonna di timestamp. (Nel nostro esempio, utilizziamo la colonna production_timestamp ).

La funzione DATE_TRUNC() tronca il timestamp alla precisione data (in questo caso, il mese). Nel nostro database, lo smartwatch ha la data di produzione 2019-09-15 07:35:13; dopo essere stato troncato alla precisione del mese, diventa 2019-09-01 00:00:00 . La precisione a livello di mese fa sì che il giorno venga visualizzato come '01' e l'ora venga riempita con zeri. (Le parti della data troncata (ad es. giorni, mesi) del timestamp vengono sostituite con quelle.)

Raggruppare i record per mese è molto comune in PostgreSQL. Nel nostro esempio, il numero di prodotti viene sommato per ogni mese. (Il COUNT() la funzione aggregata conta il numero di prodotti). Se si raggruppano i record utilizzando una funzione di aggregazione, è necessario utilizzare la clausola GROUP BY. Dopo la clausola GROUP BY, è necessario inserire le colonne o le espressioni utilizzate con la funzione di aggregazione nell'istruzione SELECT. (Nel nostro esempio, questo è DATE_TRUNC( 'month', production_timestamp) .)

Naturalmente, non è necessario utilizzare il DATE_TRUNC() funzione solo per raggruppare i record. Puoi anche usarlo per ottenere il primo giorno del mese per una determinata data.

Per ogni orologio, otteniamo il nome e la data di produzione con la precisione del mese, senza bisogno di raggruppamenti. Ecco la domanda che scriveresti:

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

Ecco il risultato:

nome produzione_al_mese
guarda 01-03-2019 00:00:00
smartwatch 01-09-2019 00:00:00
smartband 01-09-2019 00:00:00

In questa query, la funzione DATE_TRUNC() tronca il timestamp alla precisione del mese. Nel nostro database, lo smartwatch ha la data di produzione '2019-09-15 07:35:13'; ora è '2019-09-01 00:00:00' , che è il primo giorno del mese.