PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment regrouper par mois dans PostgreSQL

Problème :

Vous souhaitez regrouper les enregistrements par mois dans une base de données PostgreSQL.

Exemple :

Notre base de données a une table nommée watch avec des données dans les colonnes id , name , et production_timestamp .

identifiant nom production_horodatage
1 regarder 2019-03-01 11:45:23
2 montre intelligente 2019-09-15 07:35:13
3 bande intelligente 2019-09-22 17:22:05

Solution :

Vous pouvez utiliser le DATE_TRUNC() fonction pour regrouper les enregistrements d'une table par mois.

Voici la requête que vous écririez :

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

Voici le résultat de la requête :

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

Discussion :

Utilisez le DATE_TRUNC() fonction si vous souhaitez récupérer une date ou une heure avec une précision spécifique à partir d'une base de données PostgreSQL. (Dans notre exemple, nous avons utilisé la précision du mois.)

Cette fonction prend deux arguments. Tout d'abord, nous avons le spécificateur de partie de date (dans notre exemple, 'mois'). Notez que le spécificateur est une chaîne et doit être placé entre guillemets.

Le deuxième argument est la valeur d'horodatage ; il peut s'agir d'une expression renvoyant une valeur d'horodatage ou le nom d'une colonne d'horodatage. (Dans notre exemple, nous utilisons la colonne production_timestamp ).

La fonction DATE_TRUNC() tronque l'horodatage à la précision donnée (dans ce cas, le mois). Dans notre base de données, la smartwatch a la date de production 2019-09-15 07:35:13; après avoir été tronqué à la précision du mois, il devient 2019-09-01 00:00:00 . La précision au niveau du mois fait que le jour s'affiche sous la forme « 01 » et que l'heure est remplie de zéros. (Les parties de date tronquées (par exemple, jours, mois) de l'horodatage sont remplacées par des unités.)

Le regroupement des enregistrements par mois est très courant dans PostgreSQL. Dans notre exemple, le nombre de produits est totalisé pour chaque mois. (Le COUNT() la fonction d'agrégat compte le nombre de produits). Si vous regroupez des enregistrements à l'aide d'une fonction d'agrégation, vous devez utiliser la clause GROUP BY. Après la clause GROUP BY, vous devez placer les colonnes ou expressions utilisées avec la fonction d'agrégation dans l'instruction SELECT. (Dans notre exemple, il s'agit de DATE_TRUNC( 'month', production_timestamp) .)

Bien sûr, vous n'êtes pas obligé d'utiliser le DATE_TRUNC() fonction uniquement pour regrouper les enregistrements. Vous pouvez également l'utiliser pour obtenir le premier jour du mois pour une date donnée.

Pour chaque montre, obtenons le nom et la date de production avec la précision du mois - aucun regroupement n'est nécessaire. Voici la requête que vous écririez :

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

Voici le résultat :

nom production_to_month
regarder 2019-03-01 00:00:00
montre intelligente 2019-09-01 00:00:00
bande intelligente 2019-09-01 00:00:00

Dans cette requête, la fonction DATE_TRUNC() tronque l'horodatage à la précision du mois. Dans notre base de données, la smartwatch a la date de production '2019-09-15 07:35:13'; maintenant c'est '2019-09-01 00:00:00' , qui est le premier jour du mois.