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

Fusionner des lignes continues avec Postgresql

Voici une méthode pour résoudre ce problème. Créez un indicateur qui détermine si un enregistrement ne le fait pas superposer avec le précédent. C'est le début d'un groupe. Ensuite, prenez la somme cumulée de cet indicateur et utilisez-la pour le regroupement :

select user_id, min(begin_at) as begin_at, max(end_at) as end_at
from (select s.*, sum(startflag) over (partition by user_id order by begin_at) as grp
      from (select s.*,
                   (case when lag(end_at) over (partition by user_id order by begin_at) >= begin_at
                         then 0 else 1
                    end) as startflag
            from slots s
           ) s
     ) s
group by user_id, grp;

Ici est un violon SQL.