You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 05:18:01