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

Comment regrouper les horodatages en îles (basés sur un écart arbitraire) ?

Cela le ferait :

SELECT done, count(*) FILTER (WHERE step) OVER (ORDER BY done) AS grp
FROM  (
   SELECT done
       , (lag(done) OVER (ORDER BY done) <= done - interval '2 min') AS step
   FROM   tbl
   ) sub
ORDER  BY done;

La sous-requête sub enregistre step comme true si la ligne précédente est à au moins 2 minutes - trié par la colonne d'horodatage done lui-même dans ce cas.

La requête externe ajoute un nombre continu d'étapes, en fait le numéro de groupe (grp ) - combinant l'agrégat FILTER clause avec une autre fonction de fenêtre.

db<>jouez ici

Connexe :

  • Requête pour trouver tous les horodatages à plus d'un certain intervalle
  • Comment étiqueter les groupes dans postgresql lorsque l'appartenance au groupe dépend de la ligne précédente ?
  • Sélectionner la séquence continue la plus longue
  • Regroupement ou fenêtre

À propos de l'agrégat FILTER clause :

  • Comment puis-je simplifier cette requête de statistiques de jeu ?
  • Fonction avance/décalage conditionnel PostgreSQL ?