我需要SELECT
表中的所有行,其中所选行比先前选择的行的日期时间大给定的恒定分钟数。一个例子可能最能说明问题。
下面代表数据表——我们称之为myTable。
guid fkGuid myDate
------- ------- ---------------------
1 100 2013-01-10 11:00:00.0
2 100 2013-01-10 11:05:00.0
3 100 2013-01-10 11:10:00.0
4 100 2013-01-10 11:15:00.0
5 100 2013-01-10 11:20:00.0
6 100 2013-01-10 11:25:00.0
7 100 2013-01-10 11:30:00.0
8 100 2013-01-10 11:35:00.0
9 100 2013-01-10 11:40:00.0
10 100 2013-01-10 11:50:00.0
11 100 2013-01-10 11:55:00.0
我想要做的是提供一个恒定的增量(比如 10 分钟),并从第一行取回所有与前一行相差 10 分钟或更长时间的行。因此,10 分钟后,结果集应如下所示:
guid myDate
------- ---------------------
1 2013-01-10 11:00:00.0
3 2013-01-10 11:10:00.0
5 2013-01-10 11:20:00.0
7 2013-01-10 11:30:00.0
9 2013-01-10 11:40:00.0
11 2013-01-10 11:55:00.0
常量作为变量传入,所以它可以是任何东西。假设是 23 分钟,那么结果集应该如下所示:
guid myDate
------- ---------------------
1 2013-01-10 11:00:00.0
6 2013-01-10 11:25:00.0
10 2013-01-10 11:50:00.0
最后一个示例显示我从第 0 行的时间 (11:00:00) 开始添加 23 分钟并获得下一个 >= 行,即 11:25:00,将 23 分钟添加到新行的时间,然后获得下一个 ( 11:50:00)等等。
我曾尝试使用 CTE 执行此操作,但尽管我可以很容易地找回所有时间或没有时间,但我似乎无法弄清楚如何获得我需要的行。我当前的测试代码使用 23 分钟硬编码到 WHERE 子句中:
WITH myCTE AS
(
SELECT guid,
myDate,
ROW_NUMBER() OVER (PARTITION BY guid ORDER BY myDate ASC) AS rowNum
FROM myTable
WHERE fkGuid = 100
)
SELECT currentRow.guid, currentRow.myDate
FROM myCTE AS currentRow
LEFT OUTER JOIN
myCTE AS previousRow
ON currentRow.guid = previousRow.guid
AND currentRow.rowNum = previousRow.rowNum + 1
WHERE
currentRow.myDate > DATEADD(minute, 23, previousRow.myDate)
ORDER BY
currentRow.myDate ASC
这不返回任何内容。如果我省略该WHERE
子句,我会返回所有行(显然是因为我没有过滤)。
我错过了什么?
任何和所有的帮助都将非常感激,因为它总是如此!