sql >> Databasteknik >  >> RDS >> Oracle

Hur man grupperar på varandra följande rader i SQL efter flera kolumner

Detta är ett problem med luckor och öar. En metod för att lösa det använder row_number() :

select Date, User, min(Time) as start_time, max(time) as end_time,
       Location,
       listagg(Service, ',') within group (order by service),     
       count(*) as cnt
from (select t.*,
             row_number() over (date order by time) as seqnum,
             row_number() over (partition by user, date, location order by time) as seqnum_2
      from t
     ) t
group by Date, User, Location, (seqnum - seqnum_2);

Det är lite knepigt att förklara hur detta fungerar. Mitt förslag är att köra underfrågan så kommer du att se hur skillnaden mellan radnummer definierar grupperna du letar efter.



  1. Kan inte släppa tabell:En främmande nyckel-begränsning misslyckas

  2. Många till många bord - Prestanda är dålig

  3. MySQL främmande nycklar på mig själv

  4. Hur konfigurerar man fjäderstartapplikationen för att använda SSL/TLS över MySQL?