0

連続する 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
4

1 に答える 1

0

これがあなたが求めているものかどうかを確認してください。最初の StartDate と最新の EndDate を取得して範囲を定義する CTE から始めます。次に、別の 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)
于 2013-06-18T15:22:52.887 に答える