PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Mesclar linhas contínuas com Postgresql


Aqui está um método para resolver este problema. Crie um sinalizador que determine se um registro não sobrepõe-se ao anterior. Este é o início de um grupo. Em seguida, pegue a soma cumulativa desse sinalizador e use-a para agrupar:
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;

Aqui é um violino SQL.