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
答案 0 :(得分:3)
在这种情况下,您可以使用window functions,例如LEAD
和LAG
:
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;