2010-01-25 7 views
1

장치 "하트 비트"에 사용되는 로깅 테이블이 있습니다. 10 분마다 서버와 체크인/하트 비트하는 네트워크 장치가 있습니다. 예약 된 체크인 시간을 놓친 경우 통계를 원합니다. 나는 장치별로 이것을 할 수있는 쿼리를 가지고 있지만 모든 장치에서 처리하도록 수정해야한다.주어진 값보다 큰 DateDiff를 집계하는 SQL 쿼리

하트 비트 테이블은 다음과 같다 : 서버에

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 분 넘게 체크인을 한 기기 목록이었습니다. 이렇게하면 문제가있는 장치를 알려주는 12 분 이상의 체크인 시간을 가진 상위 10 개 또는 20 개의 장치를 볼 수 있습니다. 다음과 같음 :

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 

참고 : 테스트 데이터가없는 - 테스트하지 않았고, 오타가있을 수 있습니다.

그것은 그것에게 작은 쿼리를 만들기로 Y의 CTE 제거 및 변경 될 수 있어야한다 : 작동

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

! 매우 고맙습니다. –

+0

YW, 저의 기쁨. – Hogan

관련 문제