我有一個表跟蹤爲特定的Device_IDs創建的Incident_IDs的Datetime,我試圖找到一種方法來跟蹤日期範圍內的慢性問題。慢性問題的定義是在過去5天內創建了3個或更多Incident_ID的任何Device_ID。我需要能夠搜索一系列不同的日期(通常是每月)。MS SQL 2014 - 在日期範圍內重複出現的次數
鑑於表:
IF OBJECT_ID('tempdb.dbo.#temp') IS NOT NULL
DROP TABLE #temp
CREATE TABLE #temp
(Device_ID INT,
Incident_ID INT,
Incident_Datetime DATETIME)
INSERT INTO #temp
VALUES
(2,1001,'2016-02-01'),
(3,1002,'2016-02-02'),
(2,1003,'2016-02-09'),
(2,1004,'2016-02-10'),
(5,1005,'2016-02-12'),
(2,1006,'2016-02-13'),
(5,1007,'2016-02-14'),
(5,1008,'2016-02-15'),
(3,1009,'2016-02-18'),
(3,1010,'2016-02-19'),
(3,1011,'2016-02-20'),
(5,1012,'2016-02-21'),
(3,1013,'2016-03-18'),
(3,1014,'2016-03-19'),
(3,1015,'2016-03-20');
爲02-2016慢性問題期望的結果是:
Device_ID Incident_ID Incident_Datetime
2 1003 2/9/16 0:00
2 1004 2/10/16 0:00
2 1006 2/13/16 0:00
3 1009 2/18/16 0:00
3 1010 2/19/16 0:00
3 1011 2/20/16 0:00
5 1005 2/12/16 0:00
5 1007 2/14/16 0:00
5 1008 2/15/16 0:00
我曾嘗試下面的查詢,顯示我的事件的上升計數和讓我找到那些長期存在問題的device_id,但我很難隔離構成慢性問題的所有事件,同時排除在3天範圍之外發生的異常值。
SELECT c.Device_ID, c.Incident_ID, c.Incident_Datetime,
(SELECT COUNT(*)
FROM #temp AS t
WHERE
c.Device_ID = t.Device_ID
AND
t.Incident_Datetime BETWEEN DATEADD(DAY,-5,c.Incident_Datetime) AND c.Incident_Datetime) AS Incident_Count
FROM #temp AS c
WHERE
c.Incident_Datetime >= '2016-02-01'
AND
c.Incident_Datetime < '2016-03-01'
ORDER BY
Device_ID, Incident_Datetime
真棒,這個工程,並且正是我需要克服這個問題給我的心理障礙的替代方法。我將需要磨合CROSS APPLY,因爲它們不是我經常使用的東西,但它確實有效! – Jericho
這是我第一次真正使用它自己。它給了我很多關於如何在將來使用它的想法。所以我很欣賞心理鍛鍊。 :) –