Период скользящего SQL 20 дней

Мне было интересно, как лучше всего найти, если за любой непрерывный период в 20 дней количество событий превысило 10.

Я пытаюсь написать отчет об исключении, но не могу понять логику, кроме использования цикла.

Я включил схему для таблицы.

ID       |StartDate       |EndDate       |Area


---------+---------+---------+---------

12       |01-02-2013       |05-02-2013       |A12

14       |06-02-2013       |12-02-2013       |A13

15       |11-02-2013       |19-02-2013       |A14

19       |16-02-2013       |26-02-2013       |A15

21       |21-02-2013       |05-03-2013       |A16

24       |01-02-2013       |05-02-2013       |A17

26       |06-02-2013       |12-02-2013       |A18

28       |11-02-2013       |19-02-2013       |A19

30       |16-02-2013       |26-02-2013       |A20

33       |21-02-2013       |05-03-2013       |A21

У меня есть частичное решение: '

'DECLARE @START AS DATE
DECLARE @END AS DATE
SET @START= '20130201'
SET @END= '20130204'
SELECT     n.EVENT_DATE,
                          (SELECT     SUM(SESSIONS) AS Total_Sessionsn 
                            FROM          dbo.[Session]
                            WHERE      (EVENT_DATE BETWEEN DATEADD(d,-20,n.EVENT_DATE)     AND n.EVENT_DATE)
                            GROUP BY AREA_CODE, SITE_CODE) AS Sessions         
FROM         [dbo].[Session] AS n
WHERE     EVENT_DATE BETWEEN @START
 AND DATEADD(d,20+dbo.HolidayCount(@END,DATEADD(d,20,@END)) ,@END )'

Понятно. Для всех, кто заинтересован в поиске даты через 20 рабочих дней, я добавил решение ниже. :) (Я чувствую себя глупо!)

/****** Script for SelectTopNRows command from SSMS  ******/
SELECT TOP 1  [SK_CAL]
      ,[CAL_DATE]
      ,[CAL_CODE]
      ,[CAL_VALUE]
      ,[CAL_OPEN]
      ,[CAL_CLOSE]
FROM 
(SELECT TOP 20 [SK_CAL]
      ,[CAL_DATE]
      ,[CAL_CODE]
      ,[CAL_VALUE]
      ,[CAL_OPEN]
      ,[CAL_CLOSE]
  FROM [tempdb].[dbo].[tbCalendar]
  WHERE (CAL_DATE>'20130201' AND CAL_VALUE=1)
  ORDER BY SK_CAL ASC) n
  ORDER BY SK_CAL DESC

person user2012276    schedule 18.06.2013    source источник
comment
Идентифицирует ли каждый идентификационный номер событие?   -  person Mike Sherrill 'Cat Recall'    schedule 18.06.2013
comment
Как вы определяете дату начала непрерывного периода: сегодня или дату события?   -  person Stoleg    schedule 18.06.2013
comment
Начало любого события -19 дней будет одним скользящим 20-дневным периодом, и аналогично последний день + 19 дней будет еще одним 20-дневным периодом.   -  person user2012276    schedule 18.06.2013
comment
Все еще не уверен, что вы спрашиваете. Это несколько событий, потенциально одновременных, верно? Вы ищете количество одновременно происходящих событий в любой момент времени?   -  person JC Ford    schedule 18.06.2013
comment
Моя проблема в настоящее время заключается в том, как сделать это в течение 20 рабочих дней вместо 20 дней. Идея функции HolidayCount заключалась в том, чтобы подсчитать общее количество выходных между началом и концом и добавить его к дате окончания. Это не работает. :(   -  person user2012276    schedule 21.06.2013


Ответы (1)


Посмотрите, если это то, что вам нужно. Я начинаю с CTE, который получает самую раннюю StartDate и последнюю EndDate для определения диапазона. Затем еще один CTE экстраполирует все даты между ними. Затем для каждой даты в диапазоне я вижу, сколько событий было активно за 20 дней до этой даты включительно. Я определяю это, проверяя, происходят ли даты начала или окончания события в течение скользящего 20-дневного периода или даты начала и окончания события инкапсулируют весь скользящий 20-дневный период.

;with StartEnd as (
select 
    min(StartDate) StartRange, 
    max(EndDate) EndRange
 from 
    @Events
),
DatesInRange AS 
(
    SELECT StartRange AS RangeDate, dateadd(d,-19,StartRange) Rolling20Start from StartEnd
    UNION ALL
    SELECT DATEADD(DAY, 1, RangeDate), DATEADD(DAY, -18, RangeDate)
    FROM DatesInRange, StartEnd
    WHERE RangeDate < EndRange
)
select
    RangeDate,
    count(*)
from 
    DatesInRange
    left join @Events e on 
        e.StartDate between Rolling20Start and RangeDate or 
        e.EndDate between Rolling20Start and RangeDate or
        (e.StartDate < Rolling20Start and e.EndDate > RangeDate)
group by
    RangeDate
OPTION (MAXRECURSION 0)
person JC Ford    schedule 18.06.2013
comment
у меня частичное решение - person user2012276; 21.06.2013