2 min read

Regrouper des données PostgreSQL par mois

Il existe une façon simple de retourner des données regroupées par mois avec PostgreSQL.

Il y a quelques jours, j’ai eu besoin de faire une extraction rapide de données pour trouver le nombre d’utilisateur créés chaque mois sur les 12 derniers mois. J’ai commencé alors à faire des select count(*) from users where created_at between '2021-01-01' and '2021-01-31';  copier la valeur qui m’intéresse et recommencer pour le mois suivant.

J’ai fait ça à 3 reprises avant de me dire : « Hey ! Il y a peut-être moyen de faire ça en une seule requête ? ». Je me suis donc mis à chercher, et j’ai fini par trouver mon bonheur grâce aux fonctions to_char et date_part de PostgreSQL.

SELECT
  to_char(created_at, 'Month YYYY') AS Month,
  count(DISTINCT id)
FROM
  selections
WHERE
  date_part('year', created_at) = 2022
GROUP BY
  date_part('month', created_at),
  to_char(created_at, 'Month YYYY')
ORDER BY
  date_part('month', created_at);

La fonction date_part  permet d’extraire d’un timestamp une partie de celui-ci, ici elle sert dans la clause WHERE pour choisir l’année souhaité et pour ordonner les résultats par mois.

La fonction to_char elle sert à formatter un timestamp selon le pattern passé en second paramètre.

On obtient alors le résultat suivant

Month Count
January 2022 42
February 2022 1337
... ...

Pour aller plus loin

How to Group by Month in PostgreSQL
Problem: You’d like to group records by month in a PostgreSQL database.Example: Our database has a table named watch with data in the columns id, name, and production_timestamp. idnameproduction_timestamp 1watch2019-03-01 11:45:23 2smartwatch2019-09-15 07:35:13 3smartband2019-09-22 17:2…
Get the Month Name from a Date in PostgreSQL
9.8. Data Type Formatting Functions
9.8. Data Type Formatting Functions The PostgreSQL formatting functions provide a powerful set of tools for converting various data types (date/time, …
9.9. Date/Time Functions and Operators
9.9. Date/Time Functions and Operators 9.9.1. EXTRACT, date_part 9.9.2. date_trunc 9.9.3. date_bin 9.9.4. AT TIME ZONE 9.9.5. Current Date/Time 9.9.6. Delaying …