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

Sådan grupperes efter måned i PostgreSQL

Problem:

Du vil gerne gruppere poster efter måned i en PostgreSQL-database.

Eksempel:

Vores database har en tabel med navnet watch med data i kolonnerne id , name , og production_timestamp .

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

Løsning:

Du kan bruge DATE_TRUNC() funktion til at gruppere poster i en tabel efter måned.

Her er den forespørgsel, du ville skrive:

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

Her er resultatet af forespørgslen:

produktion_til_måned tæller
2019-03-01 00:00:00 1
2019-09-01 00:00:00 2

Diskussion:

Brug DATE_TRUNC() funktion, hvis du ønsker at hente en dato eller tid med en bestemt præcision fra en PostgreSQL-database. (I vores eksempel brugte vi månedspræcision.)

Denne funktion tager to argumenter. For det første har vi datodel-specifikationen (i vores eksempel 'måned'). Bemærk, at specifikationen er en streng og skal være omgivet af anførselstegn.

Det andet argument er tidsstempelværdien; dette kan være et udtryk, der returnerer en tidsstempelværdi eller navnet på en tidsstempelkolonne. (I vores eksempel bruger vi kolonnen production_timestamp ).

Funktionen DATE_TRUNC() afkorter tidsstemplet til den givne præcision (i dette tilfælde måneden). I vores database er smartwatch har produktionsdatoen 2019-09-15 07:35:13; efter det er blevet afkortet til månedspræcision, bliver det 2019-09-01 00:00:00 . Præcisionen på månedsniveau får dagen til at blive vist som '01', og tidspunktet udfyldes med nuller. (De afkortede datodele (f.eks. dage, måneder) af tidsstemplet erstattes med enere.)

Gruppering af poster efter måned er meget almindelig i PostgreSQL. I vores eksempel summeres antallet af produkter for hver måned. (COUNT() aggregeret funktion tæller antallet af produkter). Hvis du grupperer poster ved hjælp af en aggregeret funktion, skal du bruge GROUP BY-udtrykket. Efter GROUP BY-sætningen skal du placere de kolonner eller udtryk, der bruges med aggregatfunktionen, i SELECT-sætningen. (I vores eksempel er dette DATE_TRUNC( 'month', production_timestamp) .)

Du behøver selvfølgelig ikke bruge DATE_TRUNC() funktion kun til at gruppere poster. Du kan også bruge den til at få den første dag i måneden for en given dato.

Lad os for hvert ur få navnet og produktionsdato til måned præcision – ingen gruppering nødvendig. Her er den forespørgsel, du ville skrive:

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

Her er resultatet:

navn produktion_til_måned
se 2019-03-01 00:00:00
smartwatch 2019-09-01 00:00:00
smartbånd 2019-09-01 00:00:00

I denne forespørgsel er funktionen DATE_TRUNC() afkorter tidsstemplet til måneds præcision. I vores database er smartwatch har produktionsdatoen '2019-09-15 07:35:13'; nu er det '2019-09-01 00:00:00' , som er den første dag i måneden.


  1. MySQL vælger hurtigt 10 tilfældige rækker fra 600.000 rækker

  2. Sådan fungerer Setseed() i PostgreSQL

  3. Hvordan DEGREES() virker i MariaDB

  4. Hvad er databasedeling?