用于按顺序提取记录的SQL查询

时间:2018-02-01 06:17:50

标签: sql postgresql

PostgreSQL 9.4

我想提取序列ON后面的记录>等待>根据日期关闭。在这种情况下,结果应仅返回带有键1的记录。

表格

    key  state  date
    1    ON     1/1/2018
    1    WAIT   1/2/2018
    2    ON     1/1/2018
    2    OFF    1/2/2018
    1    OFF    1/3/2018

2 个答案:

答案 0 :(得分:3)

在这种情况下,您可以使用window functions,例如LEADLAG

SELECT  "key"
FROM
        (
            SELECT  "key", "state", "date",
                    LAG("state") OVER (PARTITION BY "key" ORDER BY date ASC) LAG_STATE,
                    LEAD("state") OVER (PARTITION BY "key" ORDER BY date ASC) LEAD_STATE
            FROM    Table1
        ) AS a
WHERE   LAG_STATE = 'ON'
        AND state = 'WAIT'
        AND LEAD_STATE = 'OFF'

这是DEMO

答案 1 :(得分:1)

一种方法是概念性地检查每个密钥的每个记录,并检查序列规则的完整性。不同日期的自我加入可以在这里工作。然后按键聚合,并确保整个序列有效,并且三个状态中的每一个实际上都是由该键发生的。

WITH cte AS (
    SELECT t1.key, t1.state,
        CASE WHEN t2.date IS NULL OR
            (t1.state = 'ON' AND t2.state = 'WAIT' OR
             t1.state = 'ON' AND t2.state = 'OFF' OR
             t1.state = 'WAIT' AND t2.state = 'OFF') THEN 0 ELSE 1 END AS label
    FROM yourTable t1
    LEFT JOIN yourTable t2
        ON t1.date = t2.date - INTERVAL '1 day' AND t1.key = t2.key
)

SELECT key
FROM cte
WHERE state IN ('ON', 'WAIT', 'OFF')
GROUP BY key
HAVING SUM(label) = 0 AND COUNT(DISTINCT state) = 3;

Demo