我有一个充满活动记录的SQL 2005 DB,其中包括DateTime列,DeviceID和各种数据位。我需要一个查询,它会根据DeviceID(可能受开始/结束时间限制)给出一个日期/时间范围列表。此外,我会考虑一个新的范围,在旧的范围结束后至少60分钟开始(如果它不到60分钟,则它是旧范围的一部分)。
示例数据:
DateTime DeviceID 2009-10-11 12:01:30 Dev1 2009-10-11 12:02:30 Dev1 2009-10-11 12:03:21 Dev1 2009-10-11 12:04:30 Dev1 2009-10-11 12:05:45 Dev1 2009-10-11 12:06:10 Dev1 2009-10-11 12:07:40 Dev1 2009-10-11 12:08:20 Dev1 2009-10-11 13:30:11 Dev1 2009-10-11 13:32:21 Dev1 2009-10-11 13:36:45 Dev1 2009-10-11 13:39:16 Dev1 2009-10-11 13:42:18 Dev1 2009-10-11 13:46:22 Dev1 2009-10-11 13:48:35 Dev1
预期结果:
StartDate EndDate 2009-10-11 12:01:30 2009-10-11 12:08:20 2009-10-11 13:30:11 2009-10-11 13:48:35
答案 0 :(得分:0)
阅读有关ROW_NUMBER()
的内容然后看看这个查询:
SELECT <br>
DeviceID,<br>
"DateTime",<br>
ROW_NUMBER() OVER(PARTITION BY DeviceID ORDER BY "DateTime") OrdinalNumber<br>
FROM TableName
Then look at this query:
WITH DateTable <br>
AS<br>
(SELECT <br>
DeviceID,<br>
"DateTime",<br>
ROW_NUMBER() OVER(PARTITION BY DeviceID ORDER BY "DateTime") OrdinalNumber<br>
FROM TableName)<br>
SELECT <br>
D1.DeviceID,<br>
D1."DateTime" EndDate,<br>
D2."DateTime" StartDate<br>
FROM DateTable D1<br>
JOIN DateTable D2<br>
ON (D1.DeviceID = D2.DeviceID) <br>
AND (D1.OrdinalNumber = D2.OrdinalNumber - 1) <br>
AND (DATEDIFF(MINUTE,D1."DateTime",D2."DateTime") >= 60)<br>
我们正在寻找差距超过60分钟的差距。
现在,您必须从每一行获取StartDate
并将其与下一个EndDate
匹配。既然是早上4点,我会把它留给你:)