Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Finden Sie fehlende Zeitintervalle in einer Tabelle

Folgendes sollte funktionieren und gibt nicht nur einen einzigen Datensatz für eine Geräte-ID zurück.

Der Kern davon ist

  • Fügen Sie jedem Datensatz eine Zeilennummer hinzu, sortiert nach Date und Neustart für jede DeviceID .
  • Verbinden Sie sich mit sich selbst, um ein Ergebnis mit Zeilen zu erstellen, die aus der Kombination von zwei ursprünglichen Zeilen bestehen. Die Beziehung zwischen den Spalten jeder Zeile ist die Zeilennummer (+1) und die DeviceID .
  • Behalten Sie nur die Zeilen bei, in denen das zugehörige Date enthalten ist mehr als 15 Minuten dauert.

SQL-Anweisung

;WITH t AS (
  SELECT  *, rn = ROW_NUMBER() OVER (PARTITION BY DeviceID ORDER BY Date)
  FROM    TestTable
)  
SELECT  t1.DeviceID, t1.Date, t2.Date
FROM    t t1
        INNER JOIN t t2 ON t2.DeviceID = t1.DeviceID AND t2.rn = t1.rn + 1
WHERE   DATEDIFF(MINUTE, t1.Date, t2.Date) > 15        

Skript testen

;WITH TestTable (ID, DeviceID, Date, Value) AS (
  SELECT 1, 3, '2011-08-24 00:00:00', 0.51 UNION ALL
  SELECT 2, 3, '2011-08-24 00:15:00', 2.9 UNION ALL
  SELECT 3, 3, '2011-08-24 00:30:00', 0 UNION ALL
  SELECT 4, 3, '2011-08-24 00:45:00', 7.1 UNION ALL
  SELECT 5, 3, '2011-08-24 01:00:00', 1.05 UNION ALL
  SELECT 6, 3, '2011-08-24 03:15:00', 3.8 
)
, t AS (
  SELECT  *, rn = ROW_NUMBER() OVER (PARTITION BY DeviceID ORDER BY Date)
  FROM    TestTable
)  
SELECT  t1.DeviceID, t1.Date, t2.Date
FROM    t t1
        INNER JOIN t t2 ON t2.DeviceID = t1.DeviceID AND t2.rn = t1.rn + 1
WHERE   DATEDIFF(MINUTE, t1.Date, t2.Date) > 15