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

如何使用Window Operators在分区上合并连续分组的列值?

使用窗口函数实现分区内连续同组的列值合并

问题分析

你需要合并同一Column A分区内连续相同Column B组的Column C值,而非合并所有同Column A+Column B的行(普通GROUP BY会做的操作)。核心是先给连续的相同组打上唯一标识,再基于标识聚合。

解决方案(以Spark SQL为例)

步骤1:生成连续组标识

利用窗口函数LAG获取前一行的Column B值,判断是否与当前行相同,再通过SUM累加差异标记,得到每个连续组的唯一ID:

WITH ranked_data AS (
    -- 生成行号,确保数据顺序与输入一致(若原表有时间戳/排序列,替换(SELECT NULL))
    SELECT 
        *,
        ROW_NUMBER() OVER (PARTITION BY ColumnA ORDER BY (SELECT NULL)) AS rn
    FROM your_table
),
grouped AS (
    SELECT
        ColumnA,
        ColumnB,
        ColumnC,
        -- 累加差异标记:当前行与前一行ColumnB不同时加1,生成连续组ID
        SUM(CASE WHEN prev_ColumnB != ColumnB THEN 1 ELSE 0 END) OVER (PARTITION BY ColumnA ORDER BY rn) AS group_id
    FROM (
        SELECT
            *,
            LAG(ColumnB) OVER (PARTITION BY ColumnA ORDER BY rn) AS prev_ColumnB
        FROM ranked_data
    ) t
)

步骤2:聚合连续组的Column C值

基于ColumnA、ColumnB和group_id分组,用CONCAT_WS合并Column C的列表:

SELECT
    ColumnA,
    ColumnB,
    CONCAT_WS(',', COLLECT_LIST(ColumnC)) AS ColumnC
FROM grouped
GROUP BY ColumnA, ColumnB, group_id
ORDER BY ColumnA, group_id;

不同SQL引擎适配

  • PostgreSQL:无需COLLECT_LIST,直接用STRING_AGG聚合:
    SELECT
        "Column A",
        "Column B",
        STRING_AGG("Column C", ',') AS "Column C"
    FROM grouped
    GROUP BY "Column A", "Column B", group_id
    ORDER BY "Column A", group_id;
    
  • Hive SQL:与Spark SQL语法一致,支持COLLECT_LIST和CONCAT_WS。

关键说明

  • 必须保证数据的顺序:SQL表本身是无序的,所以需要用ROW_NUMBER()生成行号(或使用原表的时间戳、ID等有序列),否则连续组的划分会出错。
  • 窗口函数的作用:通过LAG识别组的变化,SUM累加生成组ID,这是区分"连续同组"和"所有同组"的核心。

内容的提问来源于stack exchange,提问作者Yash Mathur

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 12:30:54