Frage

Ich habe eine Logging-Tabelle Gerät „Herzschlag“ verwendet. Ich habe diese Netzwerkgeräte, dass der Check-in / Herzschlag mit dem Server alle 10 Minuten. Wir wollen Statistiken über, wenn sie ihre Check-in-Zeit verpassen. Ich habe eine Abfrage, die diese auf einer pro Gerät tun können, aber ich brauche es auf allen Geräten Griff geändert werden.

Die Herzschlag-Tabelle sieht wie folgt aus:

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]

Gerät überprüft in den Server, fügt der Server eine Zeile in diese Tabelle mit seiner ID, dem CheckinTime und die Gerätelaufzeit (ein Wert, Hardware, die von dem Gerät gesendet). Die Abfrage Ich habe sieht derzeit wie folgt aus:

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;

Diese Abfrage wird auf ein einziges bestimmtes Gerät beschränkt. Beispielergebnisse wie folgt aussehen:

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

Idealerweise bin ich nur mit betroffenen Check-In von mehr als 12 Minuten. Also, was ich will war eine Liste der Geräte, die Check-In von mehr als 12 Minuten Zeit haben, geordnet nach ihrem zählt. Dies ermöglicht es mir die Top 10 oder 20 Geräte, um zu sehen, die größer als 12 Minuten Check-in-Zeiten haben, alarmiert mich zu Problemgeräten. So etwas wie:

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

Verbesserungsvorschläge?

War es hilfreich?

Lösung

Versuchen Sie diese:

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

. Hinweis: Verfügen Testdaten nicht - nicht getestet, können Tippfehler haben

Es sollte die y CTE werden könnte, um die es eine kleinere Abfrage entfernt und geändert werden:

select deviceID, count(deviceID) as [Checkins over 12 mins] 
FROM x 
GROUP BY deviceID
HAVING d > 12
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top