Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

За клуб редове за делничните дни

Това е доста сложно. Ето подход, използващ прозоречни функции.

Първо, използвайте таблицата с дати, за да изброите датите без почивните дни (можете също да извадите празници, ако желаете). След това разширете периодите до един ден на ред, като използвате не-equijoin.

След това можете да използвате трик, за да идентифицирате последователни дни. Този трик е да генерирате пореден номер за всеки идентификатор и да го извадите от поредния номер за датите. Това е константа за последователни дни. Последната стъпка е просто агрегиране.

Получената заявка е нещо като това:

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;

РЕДАКТИРАНЕ:

Следното е версията на това 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;

Вярвам, че това работи, но таблицата с дати не съдържа всички дати.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Стойностите на колоната за идентичност на SQL сървъра започват от 0 вместо от 1

  2. Плюсове и минуси на използването на SqlCommand Prepare в C#?

  3. Изберете Данни чрез функция с таблично значение в SQL Server

  4. Трябва ли да се декларира скаларна променлива @Id?

  5. По-добре ли е да използвате уникален идентификатор (GUID) или bigint за колона за идентичност?