Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Klubować rzędy w dni powszednie

To dość skomplikowane. Oto podejście do korzystania z funkcji okna.

Najpierw użyj tabeli dat, aby wyliczyć daty bez weekendów (możesz również wziąć dni wolne, jeśli chcesz). Następnie rozszerz okresy na jeden dzień w rzędzie, używając połączenia nierównego.

Następnie możesz użyć sztuczki, aby zidentyfikować kolejne dni. Ta sztuczka polega na wygenerowaniu numeru sekwencyjnego dla każdego identyfikatora i odjęciu go od numeru sekwencyjnego dla dat. Jest to stała dla kolejnych dni. Ostatnim krokiem jest po prostu agregacja.

Wynikowe zapytanie wygląda mniej więcej tak:

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;

EDYCJA:

Poniżej znajduje się wersja na tego Skrzypce SQL:

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;

Uważam, że to działa, ale tabela dat nie zawiera wszystkich dat.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Proaktywne kontrole stanu serwera SQL, część 1:Miejsce na dysku

  2. Zamień kolumnę tożsamości z int na bigint

  3. Jak ustawić sortowanie bazy danych w SQL Server (T-SQL)

  4. Użyj OBJECTPROPERTY(), aby dowiedzieć się, czy obiekt jest ograniczeniem CHECK w SQL Server

  5. eksport z serwera sql do pliku Excel za pomocą asp.net i vb.net?