![](/img/trans.png)
[英]postgresql: select records where ALL associated records match condition
[英]Selecting latest consecutive records that match a condition with PostgreSQL
我正在尋找PostgreSQL查詢來找到符合條件的最新連續記錄。 讓我用一個例子更好地解釋一下:
| ID | HEATING STATE | DATE |
| ---- | --------------- | ---------- |
| 1 | ON | 2018-02-19 |
| 2 | ON | 2018-02-20 |
| 3 | OFF | 2018-02-20 |
| 4 | OFF | 2018-02-21 |
| 5 | ON | 2018-02-21 |
| 6 | OFF | 2018-02-21 |
| 7 | ON | 2018-02-22 |
| 8 | ON | 2018-02-22 |
| 9 | ON | 2018-02-22 |
| 10 | ON | 2018-02-23 |
我需要找到日期> = 2018-02-20和heating_state ON的所有最近連續記錄,即ID為7、8、9、10的記錄。我的主要問題是它們必須是連續的 。
為了進一步說明,如果需要:
將LEAD
函數與CASE
表達式一起使用。
查詢1 :
SELECT id,
heating_state,
dt
FROM (SELECT t.*,
CASE
WHEN dt >= timestamp '2018-02-20'
AND heating_state = 'ON'
AND LEAD(heating_state, 1, heating_state)
OVER (
ORDER BY dt ) = 'ON' THEN 1
ELSE 0
END on_state
FROM t) s
WHERE on_state = 1
結果 :
| id | heating_state | dt |
|----|---------------|----------------------|
| 7 | ON | 2018-02-22T00:00:00Z |
| 8 | ON | 2018-02-22T00:00:00Z |
| 9 | ON | 2018-02-22T00:00:00Z |
| 10 | ON | 2018-02-23T00:00:00Z |
我認為最好使用Windows函數和篩選的聚合來解決。
對於每一行,添加state = 'OFF'
的以后的行數,然后僅使用計數為0的行。
您需要一個子查詢,因為您不能在WHERE
條件下使用窗口函數結果(在窗口函數之前先評估WHERE
)。
SELECT id, state, date
FROM (SELECT id, state, date,
count(*) FILTER (WHERE state = 'OFF')
OVER (ORDER BY date DESC, state DESC) AS later_off_count
FROM tab) q
WHERE later_off_count = 0;
id | state | date
----+-------+------------
10 | ON | 2018-02-23
9 | ON | 2018-02-22
8 | ON | 2018-02-22
7 | ON | 2018-02-22
(4 rows)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.