我正在寻找一个 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 的记录。我的主要问题是它们必须是连续的。
如需进一步说明,如有需要:
我认为最好使用 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)
| 归档时间: |
|
| 查看次数: |
1478 次 |
| 最近记录: |