PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Führen Sie fortlaufende Zeilen mit Postgresql zusammen

Hier ist eine Methode zur Lösung dieses Problems. Erstellen Sie ein Flag, das bestimmt, ob ein Datensatz nicht mit dem vorherigen überschneiden. Dies ist der Beginn einer Gruppe. Nehmen Sie dann die kumulative Summe dieses Flags und verwenden Sie diese zum Gruppieren:

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;

Hier ist eine SQL-Geige.