SQL - 查找事件序列

时间:2017-03-29 01:15:55

标签: sql sql-server-2008

我需要一些帮助来识别SQL Server 08 R2中的一系列事件。 这是样本数据:

    ID | SampleTime | SampleValue | CycleNum
    1  | 07:00:00   | 10          |
    2  | 07:02:00   | 10          |
    3  | 07:05:00   | 10          |
    4  | 07:12:00   | 20          |
    5  | 07:15:00   | 10          |
    6  | 07:22:00   | 10          |
    7  | 07:23:00   | 20          |
    8  | 07:30:00   | 20          |
    9  | 07:31:00   | 10          |  

我使用以下内容作为指南,link ,但它没有提供所需的输出

规则是:

  • 周期从10开始,到20
  • 结束
  • 在20之前可以有多个10秒,在接下来的10个之前可以有多个20秒
  • 一个循环将始终从前10个开始,并在下一个10之前的最后20个循环结束。

示例输出

    ID | SampleTime | SampleValue | CycleNum
    1  | 07:00:00   | 10          |  1
    2  | 07:02:00   | 10          |  1
    3  | 07:05:00   | 10          |  1
    4  | 07:12:00   | 20          |  1
    5  | 07:15:00   | 10          |  2
    6  | 07:22:00   | 10          |  2
    7  | 07:23:00   | 20          |  2
    8  | 07:30:00   | 20          |  2
    9  | 07:31:00   | 10          |  3

测试表

CREATE TABLE myTable (ID INT IDENTITY, SampleTime DATETIME, SampleValue INT, CycleNum INT)
INSERT INTO myTable (SampleTime, SampleValue)
VALUES ('07:00:00',10),
       ('07:02:00',10),
       ('07:05:00',10),
       ('07:12:00',20),
       ('07:15:00',10),
       ('07:22:00',10),
       ('07:23:00',20),
       ('07:30:00',20),
       ('07:31:00',10)

1 个答案:

答案 0 :(得分:3)

试试这个...这将给出ID和CYCLENUM的映射

WITH EVE_DATA AS (
  SELECT ID
    , SAMPLETIME
    , SAMPLEVALUE
    , CASE 
        WHEN (SAMPLEVALUE - lag(SAMPLEVALUE, 1, 0) over (order by SAMPLETIME ASC)) = -10
        THEN 1
        ELSE 0
    END AS START_IND
  FROM
  MY_TABLE
)
SELECT T1.id
  , SUM(T2.START_IND) + 1 AS CycleNum 
FROM EVE_DATA T1
  JOIN EVE_DATA T2
    ON T1.ID >= T2.ID
GROUP BY T1.ID
ORDER BY T1.ID;