sql >> Database >  >> RDS >> Sqlserver

Om de rijen voor weekdagen te knuppelen

Dit is best ingewikkeld. Hier is een benadering met behulp van vensterfuncties.

Gebruik eerst de datumtabel om de datums zonder weekend op te sommen (je kunt ook vakanties opnemen als je wilt). Breid vervolgens de perioden uit tot één dag per rij, door een niet-equijoin te gebruiken.

U kunt dan een truc gebruiken om opeenvolgende dagen te identificeren. Deze truc is om voor elke id een volgnummer te genereren en dit af te trekken van het volgnummer voor de datums. Dit is een constante voor opeenvolgende dagen. De laatste stap is gewoon een aggregatie.

De resulterende zoekopdracht ziet er ongeveer zo uit:

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;

BEWERKEN:

Het volgende is de versie op dit 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;

Ik geloof dat dit werkt, maar de datumtabel bevat niet alle datums.




  1. Uw database exporteren voor overdracht

  2. SAP Lumira en de JDBC-ODBC-brug

  3. SQL-script om externe sleutels voor een specifieke tabel te vinden?

  4. Opgeslagen procedure met meerdere IN-parameters