我有一个表跟踪为特定的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
这是我第一次真正使用它自己。它给了我很多关于如何在将来使用它的想法。所以我很欣赏心理锻炼。 :) –