sql >> Databasteknik >  >> RDS >> PostgreSQL

Så här grupperar du efter månad i PostgreSQL

Problem:

Du vill gruppera poster efter månad i en PostgreSQL-databas.

Exempel:

Vår databas har en tabell som heter watch med data i kolumnerna id , name , och production_timestamp .

id namn produktionstidsstämpel
1 titta 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 använda DATE_TRUNC() funktion för att gruppera poster i en tabell efter månad.

Här är frågan du skulle skriva:

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

Här är resultatet av frågan:

produktion_till_månad räkna
2019-03-01 00:00:00 1
2019-09-01 00:00:00 2

Diskussion:

Använd DATE_TRUNC() funktion om du vill hämta ett datum eller en tid med en specifik precision från en PostgreSQL-databas. (I vårt exempel använde vi månadsprecision.)

Denna funktion tar två argument. Först har vi datumdelspecifikatorn (i vårt exempel "månad"). Observera att specifikationen är en sträng och måste omges av citattecken.

Det andra argumentet är tidsstämpelvärdet; detta kan vara ett uttryck som returnerar ett tidsstämpelvärde eller namnet på en tidsstämpelkolumn. (I vårt exempel använder vi kolumnen production_timestamp ).

Funktionen DATE_TRUNC() trunkerar tidsstämpeln till den givna precisionen (i detta fall månaden). I vår databas, smartwatch har produktionsdatumet 2019-09-15 07:35:13; efter att den har trunkerats till månadsprecision blir den 2019-09-01 00:00:00 . Precisionen på månadsnivå gör att dagen visas som '01' och tiden fylls med nollor. (De trunkerade datumdelarna (t.ex. dagar, månader) av tidsstämpeln ersätts med ettor.)

Gruppering av poster efter månad är mycket vanligt i PostgreSQL. I vårt exempel summeras antalet produkter för varje månad. (COUNT() aggregatfunktion räknar antalet produkter). Om du grupperar poster med en aggregatfunktion måste du använda GROUP BY-satsen. Efter GROUP BY-satsen ska du placera kolumnerna eller uttrycken som används med aggregatfunktionen i SELECT-satsen. (I vårt exempel är detta DATE_TRUNC( 'month', production_timestamp) .)

Naturligtvis behöver du inte använda DATE_TRUNC() fungerar bara för att gruppera poster. Du kan också använda den för att få den första dagen i månaden för ett visst datum.

För varje klocka, låt oss få namnet och produktionsdatum till månad precision – ingen gruppering behövs. Här är frågan du skulle skriva:

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

Här är resultatet:

namn produktion_till_månad
titta 2019-03-01 00:00:00
smartwatch 2019-09-01 00:00:00
smartband 2019-09-01 00:00:00

I den här frågan, funktionen DATE_TRUNC() trunkerar tidsstämpeln till månadsprecision. I vår databas, smartwatch har produktionsdatumet '2019-09-15 07:35:13'; nu är det '2019-09-01 00:00:00' , vilket är den första dagen i månaden.


  1. Oracle IN vs finns skillnad?

  2. Få BLOB från BFILE-kolumnen i Oracle

  3. Hur WEEKOFYEAR() fungerar i MariaDB

  4. Hierarkiska frågor i SQL Server 2005