t-sql中的条件迭代

时间:2018-08-03 09:35:05

标签: tsql

包含数据行的表,其中包含操作的日期及其状态

   Date                    Status    
    2018-08-03 06:25:36.000   3
    2018-08-03 06:26:40.000   4
    2018-08-03 06:26:43.000   3
    2018-08-03 06:27:29.000   5
    2018-08-03 06:27:37.000   4
    2018-08-03 06:30:07.000   6
    2018-08-03 06:45:19.000   3
    2018-08-03 06:53:39.000   5
    2018-08-03 06:54:54.000   4
    2018-08-03 07:03:43.000   6
    2018-08-03 07:03:52.000   3
    2018-08-03 07:05:44.000   4

我需要完成的是遍历此数据集,首先获取状态3,然后立即获取状态4的下一次,并计算这两个日期之间的DateDiff。

因此,在给定的示例中,我想遍历整个数据集,获取第一行(状态3的第一次出现),获取第二行(此后状态4的第一次出现),计算DateDiff并移动到包含状态3,然后找到状态4的下一行,计算DateDiff并继续操作,直到遍历整个数据集,并且完成状态3和状态4之间的所有日期差异。

这可以通过游标完成吗,或者它们不适合这样做,因为我们需要的下一行可能不是数据集中的实际下一行?

1 个答案:

答案 0 :(得分:1)

您可以使用CURSOR查找状态为3的每个日期,然后使用TOP 1查找状态为4的下一个日期。

DECLARE @DateStatus3 AS DATETIME

DECLARE C_Status3 CURSOR FOR
    SELECT [Date] AS DateStatus3 FROM StatusTable WHERE Status = 3

OPEN C_Status3
FETCH NEXT FROM C_Status3 INTO @DateStatus3

WHILE @@FETCH_STATUS = 0
BEGIN

    DECLARE @DateStatus4 AS DATETIME
    SELECT @DateStatus4 = NULL

    SELECT TOP 1 @DateStatus4 = [Date] FROM StatusTable WHERE Status = 4 AND Date >= @DateStatus3 ORDER BY [Date]

    IF @DateStatus4 IS NOT NULL
        PRINT DATEDIFF(SECOND, @DateStatus3, @DateStatus4)

    FETCH NEXT FROM C_Status3 INTO @DateStatus3

END

CLOSE C_Status3
DEALLOCATE C_Status3