最佳答案
这通常称为间隙和岛屿。
一种方法是使用两个行号序列。
检查查询的每个中间结果以了解其工作原理。
WITH
CTE_rn
AS
(
SELECT
status
,dt
,ROW_NUMBER() OVER (ORDER BY dt) as rn1
,ROW_NUMBER() OVER (PARTITION BY status ORDER BY dt) as rn2
FROM
T
)
SELECT
status
,COUNT(*) AS cnt
FROM
CTE_rn
GROUP BY
status
,rn1-rn2
ORDER BY
min(dt)
;
结果
| status | cnt |
|---------|-----|
| offline | 2 |
| idle | 1 |
| offline | 2 |
| idle | 1 |
关于sql - 如何计算 PostgreSQL 中列中的重复值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60519026/