2010-01-25 1 views
1

У меня есть таблица журналов, используемая для устройства «heartbeats». У меня есть эти сетевые устройства, которые регистрируют/пускают с сервером каждые 10 минут. Нам нужна статистика, когда они пропускают запланированное время регистрации. У меня есть запрос, который может сделать это для каждого устройства, но мне нужно, чтобы он был модифицирован для обработки на всех устройствах.SQL Query для агрегирования DateDiff больше заданного значения

Сердцебиение таблица выглядит следующим образом:

CREATE TABLE [dbo].[DeviceHeartbeat](
    [Id] [int] IDENTITY(1,1) NOT NULL, 
    [DeviceId] [int] NULL, 
    [CheckinTime] [datetime] NULL, 
    [Runtime] [int] NULL, 
PRIMARY KEY CLUSTERED 
([Id] ASC)) ON [PRIMARY] 

проверки устройства на сервер, сервер добавляет строку в эту таблицу с Ид, CheckinTime и времени автономной работы устройства (значение аппаратного посланный устройства). Запрос я в настоящее время выглядит следующим образом:

WITH t AS 
(
    SELECT Checkintime, rn = ROW_NUMBER() OVER (ORDER BY Checkintime) 
    FROM DeviceHeartbeat 
    WHERE DeviceId = 1112 
), 
x AS 
(
    SELECT d = DATEDIFF(MINUTE, t1.Checkintime, t2.Checkintime) 
    FROM t AS t1 
    INNER JOIN t AS t2 
    ON t1.rn = t2.rn - 1 
), 
y AS 
(
    SELECT stats = CASE WHEN d < 10 THEN ' < 10 ' 
    WHEN d BETWEEN 10 AND 11 THEN '10 - 11 ' 
    WHEN d BETWEEN 11 AND 12 THEN '11 - 12 ' 
    ELSE '+12 ' END + ' minutes:' 
    FROM x 
) 
SELECT stats, COUNT(*) FROM y GROUP BY stats; 

Этот запрос ограничивается одним указанным устройством. Примеры результатов выглядят так:

stats     
----------------- ---- 
< 10 minutes: 1536 
10 - 11 minutes: 425 
11 - 12 minutes: 952 
+12 minutes:  160 

В идеале, я занимаюсь только регистрацией более 12 минут. Итак, что я хотел, был список устройств, у которых есть чек-записи более 12 минут, заказанные по их подсчетам. Это позволит мне увидеть 10 или 20 ведущих устройств с более чем 12-минутным временем регистрации, предупреждая меня о проблемных устройствах. Что-то вроде:

DeviceId CheckinsOver12Mins 
---------- ------------------- 
1112  160 
1108  152 
15   114 
106  86 

Предложения?

ответ

2

Попробуйте это:

WITH t AS 
(
    SELECT Checkintime, DeviceID, rn = ROW_NUMBER() OVER (ORDER BY DeviceID, Checkintime) 
    FROM DeviceHeartbeat 
), 
x AS 
(
    SELECT t1.deviceID, d = DATEDIFF(MINUTE, t1.Checkintime, t2.Checkintime) 
    FROM t AS t1 
    INNER JOIN t AS t2 
    ON t1.rn = t2.rn - 1 and t1.DeviceID = t2.DeviceID 
), 
y AS 
(
    SELECT deviceID 
    FROM x 
    WHERE d > 12 
) 
select deviceID, count(deviceID) as [Checkins over 12 mins] FROM y GROUP BY deviceID 

Примечание: Не имеют тестовые данные - не проверял, может иметь опечаток.

Это должно быть у CTE может быть удален и изменен, чтобы сделать его меньше запроса:

select deviceID, count(deviceID) as [Checkins over 12 mins] 
FROM x 
GROUP BY deviceID 
HAVING d > 12 
+0

Это работает! Большое спасибо. –

+0

YW, Мое удовольствие. – Hogan

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