sql >> Databasteknik >  >> RDS >> PostgreSQL

Slå samman kontinuerliga rader med Postgresql

Här är en metod för att lösa detta problem. Skapa en flagga som avgör om en post inte gör det överlappa med den föregående. Det här är början på en grupp. Ta sedan den kumulativa summan av denna flagga och använd den för att gruppera:

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;

Här är en SQL Fiddle.



  1. JOIN Multiple Table baserat på tidsstämpel och ett annat villkor

  2. Flera värdnamn och flera privilegier?

  3. MySQL vs MariaDB vs Percona Server:Jämförelse av säkerhetsfunktioner

  4. Varför gör Postgres en sekventiell skanning där indexet skulle returnera <1% av datan?