簡體   English   中英

選擇與PostgreSQL條件匹配的最新連續記錄

[英]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的記錄。我的主要問題是它們必須是連續的

為了進一步說明,如果需要:

  • 排除ID 1是因為早於2018-02-20
  • ID 2被排除在外是因為后面緊跟着加熱狀態為OFF的ID 3
  • ID 3被排除,因為它的加熱狀態為OFF
  • 排除ID 4,因為它后面跟着ID 5,該ID 5已關閉加熱
  • 排除ID 5,因為它的加熱狀態為OFF
  • ID 6被排除,因為它具有加熱狀態OFF

LEAD函數與CASE表達式一起使用。

SQL小提琴

查詢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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM