У меня есть таблица, которая отслеживает Datetime of Incident_ID, созданных для определенных Device_ID, и я пытаюсь найти способ отслеживания хронических проблем в течение ряда дат. Определение хронической проблемы - это любой Device_ID, у которого было 3 или более идентификаторов Incident_ID, созданных за последние 5 дней. Мне нужно иметь возможность выполнять поиск по различным датам (в основном ежемесячно).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
Я попытался следующий запрос, который показывает мне количество восходящую инцидентов и позволяет мне найти те устройства-устройства, у которых были хронические проблемы, но мне трудно изолировать все инциденты, которые составляют хронический вопрос, исключая те выбросы, которые произошли за пределами 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
Это был первый раз, когда я когда-либо использовал его на самом деле. Это дало мне много идей о том, как использовать его в будущем. Поэтому я ценю умственные упражнения. :) –