Поиск пропущенных интервалов времени в таблице

У меня есть следующая таблица, которая содержит значения, считываемые каждые 15 минут с нескольких разных устройств:

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

Я хочу найти все пробелы в таблице для каждого устройства, где нет записей, для данный месяц. Для приведенной выше таблицы результат должен быть примерно таким:

DeviceID    StartDate               EndDate
-------------------------------------------------------
3           24.08.2011 01:00:00     24.08.2011 03:15:00

В таблице примерно 35 000 устройств и 100 миллионов записей.

Вот что я пробовал; это довольно медленно, но возвращает то, что мне нужно. Однако, помимо скорости, есть еще одна проблема: он находит только пропущенные интервалы до последней записи для устройства в данном месяце; все, что после этого, будет проигнорировано, поэтому можно пропустить дополнительный интервал отсутствующих значений.

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
6
задан Conrad Frix 6 June 2012 в 06:20
поделиться