次の表には、いくつかの異なるデバイスから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
このテーブルには、約35000のデバイスと1億のエントリがあります。
これが私が試したものです。かなり遅いですが、必要なものを返します。ただし、速度に加えて、別の問題があります。特定の月のデバイスの最後のエントリまでの欠落した間隔のみが検出されます。それ以降は無視されるため、欠落している値の余分な間隔を見逃す可能性があります。
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