2013-06-18 3 views
-1

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

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

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

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 
+0

Означает ли каждый идентификационный номер событие? –

+0

Как вы определяете дату начала "непрерывного периода": сегодня или дата события? – Stoleg

+0

Начало любого события -19 дней будет одним прокатным 20-дневным периодом, и аналогичным образом последний день + 19 дней будет еще одним 20-дневным периодом. – user2012276

ответ

0

Посмотрите, если это то, что вам нужно. Я начинаю с 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) 
+0

У меня есть частичное решение – user2012276

Смежные вопросы