デバイスの「ハートビート」に使用されるログテーブルがあります。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
提案?