【发布时间】:2012-06-06 06:13:28
【问题描述】:
我有下表,其中包含每 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
【问题讨论】:
-
你可能想看看 at this 它的示例章节,涵盖了 Itzik Ben-Gan 中的间隙和岛屿主题
-
@ConradFrix 感谢您的链接。
-
@NikolaMarkovinović 谢谢,但我自己删除了这个问题。这是一个糟糕的问题,我自己设法弄清楚了(我也使用了
ROW_NUMBER())。
标签: sql sql-server-2008 gaps-and-islands