Duplicata possible:
Quel est le moyen le plus rapide pour tronquer les horodatages à 5 minutes dans Postgres?
intervalle de temps PostgreSQL SQL GROUP BY avec une précision arbitraire (jusqu'à quelques secondes)
Je veux agréger les données à un intervalle de 5 minutes dans PostgreSQL. Si j'utilise la fonction date_trunc()
, je peux agréger des données à un intervalle horaire, mensuel, quotidien, hebdomadaire, etc. mais pas à un intervalle spécifique comme 5 minutes ou 5 jours.
select date_trunc('hour', date1), count(*) from table1 group by 1;
Quelqu'un sait-il comment nous pouvons y parvenir dans PostgreSQL?
Toute aide est appréciée.
SELECT date_trunc('hour', date1) AS hour_stump
,(extract(minute FROM date1)::int / 5) AS min5_slot
,count(*)
FROM table1
GROUP BY 1, 2
ORDER BY 1, 2;
Vous pourriez GROUP BY
Deux colonnes: un horodatage tronqué à l'heure et un intervalle de 5 minutes.
L'exemple produit des emplacements 0 - 11
. Ajoutez 1
Si vous préférez 1 - 12
.
J'ai converti le résultat de extract()
en entier, de sorte que la division / 5
Tronque les chiffres fractionnaires. Le résultat:
minute 0 - 4 -> slot 0
minute 5 - 9 -> slot 1
etc.
Cette requête renvoie uniquement des valeurs pour les intervalles de 5 minutes où les valeurs sont trouvées. Si vous voulez une valeur pour chaque emplacement ou si vous voulez une somme cumulée sur des plages de 5 minutes, considérez cette réponse connexe:
PostgreSQL: exécution du nombre de lignes pour une requête 'par minute'
Voici une requête simple que vous pouvez soit encapsuler dans une fonction, soit couper et coller partout:
select now()::timestamp(0), (extract(Epoch from now()::timestamptz(0)-date_trunc('d',now()))::int)/60;
Cela vous donnera l'heure actuelle et un nombre de 0 à n-1 où n = 60 ici. Pour le faire toutes les 5 minutes, faites ce chiffre 300 et ainsi de suite. Il se regroupe par secondes depuis le début de la journée. Pour le regrouper par secondes depuis le début de l'année, le début de l'heure ou quoi que ce soit d'autre, changez le "d" dans date_trunc.