Regrouper des données PostgreSQL par mois
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 |
... | ... |