Finde fehlende Zeitintervalle in einer Tabelle
Ich habe die folgende Tabelle, die Werte enthält, die alle 15 Minuten von verschiedenen Geräten gelesen werden:
ID DeviceID Date Value
----------------------------------------------
1 3 24.08.2011 00:00:00 0.51
2 3 24.08.2011 00:15:00 2.9
3 3 24.08.2011 00:30:00 0
4 3 24.08.2011 00:45:00 7.1
5 3 24.08.2011 01:00:00 1.05
6 3 24.08.2011 03:15:00 3.8
Ich möchte alle Lücken in der Tabelle für jedes Gerät finden, für das für einen bestimmten Monat keine Einträge vorhanden sind. Für die obige Tabelle sollte das Ergebnis ungefähr so aussehen:
DeviceID StartDate EndDate
-------------------------------------------------------
3 24.08.2011 01:00:00 24.08.2011 03:15:00
Die Tabelle enthält ungefähr 35000 Geräte und 100 Millionen Einträge.
Das habe ich versucht; Es ist ziemlich langsam, gibt aber das zurück, was ich brauche. Neben der Geschwindigkeit gibt es jedoch ein weiteres Problem: Es werden nur fehlende Intervalle bis zum letzten Eintrag für ein Gerät im angegebenen Monat gefunden. alles, was danach folgt, wird ignoriert, so dass es möglich ist, ein zusätzliches Intervall fehlender Werte auszulassen.
SELECT
t2.Date AS StartDate
, t1.Date AS EndDate
FROM
TestTable t1
INNER JOIN TestTable t2 ON t1.DeviceID = t2.DeviceID
WHERE
(t2.Date = (SELECT MAX(Date) FROM TestTable t3 WHERE t3.Date < t1.Date AND t3.DeviceID = t1.DeviceID)
AND DATEDIFF(MINUTE, t2.Date, t1.Date) > 15)
AND t1.DeviceID = @id
AND DATEPART(YEAR, t1.Date) = @year AND DATEPART(MONTH, t1.Date) = @month