与えられた値よりも集約DateDiff関数の大きいへのSQLクエリ
質問
私は、デバイス「ハートビート」のために使用されるログテーブルを持っています。私は、チェックイン/ハートビートサーバとは、10分ごとに、これらのネットワークデバイスを持っています。我々は、彼らが自分の予定のチェックインの時間を逃したときの統計を希望しています。私は、デバイスごとにこれを行うことができ、クエリを持って、私はそれがすべてのデバイス間でハンドルに変更する必要があります。
このようなハートビート・テーブル・ルックスます:
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]
デバイスチェックサーバには、サーバは、そのID、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
提案?
解決
これを試してみてください
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
注:DOは、テストデータを持っていない - テストしていない、タイプミスがあるかもしれません。
。これは、yのCTEは、それより小さなクエリ作りに削除、変更することができする必要があります:
select deviceID, count(deviceID) as [Checkins over 12 mins]
FROM x
GROUP BY deviceID
HAVING d > 12
所属していません StackOverflow