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 jedeDeviceID
. - 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