sql >> Databasteknik >  >> RDS >> Sqlserver

Att klubba raderna under vardagar

Det här är ganska komplicerat. Här är ett tillvägagångssätt som använder fönsterfunktioner.

Använd först datumtabellen för att räkna upp datumen utan helger (du kan även ta ut semester om du vill). Utöka sedan perioderna till en dag per rad genom att använda en icke-equijoin.

Du kan sedan använda ett knep för att identifiera sekventiella dagar. Det här tricket är att generera ett sekvensnummer för varje id och subtrahera det från sekvensnumret för datumen. Detta är en konstant för på varandra följande dagar. Det sista steget är helt enkelt en sammanställning.

Den resulterande frågan är ungefär så här:

with d as (
      select d.*, row_number() over (order by date) as seqnum
      from dates d
      where day not in ('Saturday', 'Sunday')
     )
select t.id, min(t.date) as startdate, max(t.date) as enddate, sum(duration)
from (select t.*, ds.seqnum, ds.date,
             (d.seqnum - row_number() over (partition by id order by ds.date) ) as grp
      from table t join
           d ds
           on ds.date between t.startdate and t.enddate
     ) t
group by t.id, grp;

EDIT:

Följande är versionen på denna SQL Fiddle:

with d as (
      select d.*, row_number() over (order by date) as seqnum
      from datetable d
      where day not in ('Saturday', 'Sunday')
     )
select t.id, min(t.date) as startdate, max(t.date) as enddate, sum(duration)
from (select t.*, ds.seqnum, ds.date,
             (ds.seqnum - row_number() over (partition by id order by ds.date) ) as grp
      from (select t.*, 'abc' as id from table1 t) t join
           d ds
           on ds.dateid between t.startdate and t.enddate
     ) t
group by grp;

Jag tror att det här fungerar, men datumtabellen innehåller inte alla datum.




  1. Lista alla SQL-kolumner med maxlängd OCH största längd

  2. Markera söktext i mysql php-sökning

  3. MySQL sök json värde med nyckel i array

  4. Hur man ansluter postgresql i hibernate.cfg.xml