代码之家  ›  专栏  ›  技术社区  ›  Mefhisto1

T-SQL中的条件迭代

  •  0
  • Mefhisto1  · 技术社区  · 6 年前

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

       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的下一个出现,并计算这两个日期之间的日期差。

    所以在给出的例子中,我想迭代整个数据集,取第一行(状态3的第一次出现),取第二行(状态4的第一次出现),计算datediff并移动到包含状态3的下一行,找到状态4的下一行,计算datediff并继续,直到整个数据集被迭代,和all状态3和4之间的日期差异已完成。

    这可以由光标来完成,还是它们不适合这样做,因为我们需要的下一行可能不是数据集中的实际下一行?

    1 回复  |  直到 6 年前
        1
  •  1
  •   tezzo    6 年前

    你可以使用 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