sql >> Database >  >> RDS >> PostgreSQL

Doorlopende rijen samenvoegen met Postgresql

Hier is een methode om dit probleem op te lossen. Maak een vlag die bepaalt of een record niet . doet overlap met de vorige. Dit is het begin van een groep. Neem dan de cumulatieve som van deze vlag en gebruik die voor het groeperen:

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 is een SQL Fiddle.



  1. Hoe een regex-patroon in MySQL te vervangen

  2. Hoe verander ik alle lege strings in NULL in een tabel?

  3. Gegevens ophalen uit opgeslagen procedure met meerdere resultaatsets

  4. Oracle DB:hoe kan ik een query schrijven waarbij ik case negeer?