sql >> Database >  >> RDS >> PostgreSQL

Hoe te groeperen op maand in PostgreSQL

Probleem:

U wilt records per maand groeperen in een PostgreSQL-database.

Voorbeeld:

Onze database heeft een tabel met de naam watch met gegevens in de kolommen id , name , en production_timestamp .

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

Oplossing:

U kunt de DATE_TRUNC() . gebruiken functie om records per maand in een tabel te groeperen.

Dit is de vraag die je zou schrijven:

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

Dit is het resultaat van de zoekopdracht:

production_to_month tel
2019-03-01 00:00:00 1
2019-09-01 00:00:00 2

Discussie:

Gebruik de DATE_TRUNC() functie als u een datum of tijd met een bepaalde precisie uit een PostgreSQL-database wilt ophalen. (In ons voorbeeld gebruikten we de precisie van de maand.)

Deze functie heeft twee argumenten. Ten eerste hebben we de specificatie van het datumgedeelte (in ons voorbeeld 'maand'). Merk op dat de specificatie een tekenreeks is en tussen aanhalingstekens moet worden geplaatst.

Het tweede argument is de tijdstempelwaarde; dit kan een expressie zijn die een tijdstempelwaarde retourneert of de naam van een tijdstempelkolom. (In ons voorbeeld gebruiken we de kolom production_timestamp ).

De functie DATE_TRUNC() kapt de tijdstempel af tot de opgegeven precisie (in dit geval de maand). In onze database is de smartwatch heeft de productiedatum 2019-09-15 07:35:13; nadat het is afgekapt tot maandprecisie, wordt het 2019-09-01 00:00:00 . De precisie op maandniveau zorgt ervoor dat de dag wordt weergegeven als '01' en de tijd wordt gevuld met nullen. (De afgekapte datumdelen (bijv. dagen, maanden) van de tijdstempel worden vervangen door enen.)

Het groeperen van records per maand is heel gebruikelijk in PostgreSQL. In ons voorbeeld wordt het aantal producten per maand opgeteld. (De COUNT() aggregatiefunctie telt het aantal producten). Als u records groepeert met behulp van een aggregatiefunctie, moet u de GROUP BY-component gebruiken. Na de GROUP BY-component moet u de kolommen of expressies die worden gebruikt met de aggregatiefunctie in de SELECT-instructie plaatsen. (In ons voorbeeld is dit DATE_TRUNC( 'month', production_timestamp) .)

Natuurlijk hoeft u de DATE_TRUNC() . niet te gebruiken functie alleen om records te groeperen. Je kunt het ook gebruiken om de eerste dag van de maand voor een bepaalde datum te krijgen.

Laten we voor elk horloge de naam en productiedatum tot maand nauwkeurig weergeven - geen groepering nodig. Dit is de vraag die je zou schrijven:

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

Dit is het resultaat:

naam productie_naar_maand
kijk 2019-03-01 00:00:00
smartwatch 2019-09-01 00:00:00
smartband 2019-09-01 00:00:00

In deze query is de functie DATE_TRUNC() kapt de tijdstempel af tot maandprecisie. In onze database is de smartwatch heeft de productiedatum '2019-09-15 07:35:13'; nu is het '2019-09-01 00:00:00' , dat is de eerste dag van de maand.


  1. CDC inschakelen op een reeks tabellen OF inschakelen op alle tabellen in een database in SQL Server - SQL Server-zelfstudie

  2. Geen gegevens meer om uit socket te lezen

  3. MySQL/schrijfbestand fout (Errcode 28)

  4. Hoe u de huidige tijd in PostgreSQL kunt krijgen