PostgreSQL如何用SQL实现连续相同值分组并统计连续出现次数
实现方案
可以实现,这是经典的「间隙与岛屿(Gaps and Islands)」类问题,用PostgreSQL内置的窗口函数即可完成需求。
实现思路
- 首先通过
LAG()窗口函数比对当前行与上一行的data值,值不同则打标记1,值相同则打标记0 - 对上述标记做累加求和,得到分组ID,所有连续相同
data值的行会归属到同一个分组ID下 - 最后按分组ID和
data字段聚合,取每组最小的order作为组起始序号,统计每组行数即为连续出现次数
示例SQL
WITH step1 AS ( SELECT "order", data, -- 比对上一行data值,不同则标记为1 CASE WHEN LAG(data) OVER (ORDER BY "order") = data THEN 0 ELSE 1 END AS diff_flag FROM 你的实际表名 -- 替换为自己的表名 ), step2 AS ( SELECT "order", data, -- 累加标记生成连续分组ID SUM(diff_flag) OVER (ORDER BY "order") AS group_id FROM step1 ) SELECT MIN("order") AS "order", data, COUNT(*) AS count FROM step2 GROUP BY group_id, data ORDER BY "order";
提示:
order是SQL保留关键字,因此示例中用双引号包裹避免语法报错,如果你的实际列名不是order可以去掉双引号。
执行上述SQL后输出结果和你期望的完全一致。
内容的提问来源于stack exchange,提问作者electrode
相关产品推荐
相关产品推荐

