选择与PostgreSQL匹配条件的最新连续记录

spa*_*ode 5 sql 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 |
Run Code Online (Sandbox Code Playgroud)

我需要找到所有最近的连续记录,日期 >= 2018-02-20 并且加热状态为 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 被排除,因为它的加热状态为 OFF
  • ID 6 被排除,因为它的加热状态为 OFF

Lau*_*lbe 5

我认为最好使用 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)
Run Code Online (Sandbox Code Playgroud)