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

DB2 SQL如何利用LISTAGG实现分条件取Top值并合并为单行

DB2 SQL 实现指定数据提取与LISTAGG合并方案

实现思路

  1. 用窗口函数按a分组,每组内按c降序排名,筛选出a=N的前3条、a=Y的前2条数据;
  2. 对筛选后的b值按a分组,升序排列后用LISTAGG合并为组内字符串;
  3. 最终将各组结果合并为单行目标格式。

完整SQL代码

WITH ranked_data AS (
    SELECT 
        a, 
        b,
        -- 按a分组,每组内按c降序编号
        ROW_NUMBER() OVER (PARTITION BY a ORDER BY c DESC) AS rn
    FROM test_table -- 替换为你的实际表名
),
filtered_data AS (
    SELECT 
        a, 
        b
    FROM ranked_data
    -- 筛选N的前3条、Y的前2条
    WHERE (a = 'N' AND rn <= 3) OR (a = 'Y' AND rn <= 2)
)
-- 先按a分组合并b值,再合并所有组的结果
SELECT 
    LISTAGG(CONCAT(a, ' = ', group_b), '; ') WITHIN GROUP (ORDER BY a) AS final_result
FROM (
    SELECT 
        a,
        -- 组内b值升序合并
        LISTAGG(b, ', ') WITHIN GROUP (ORDER BY b) AS group_b
    FROM filtered_data
    GROUP BY a
) grouped_result;

关键语法说明

  • ROW_NUMBER() OVER (PARTITION BY a ORDER BY c DESC):按a分组后,每组内根据c从高到低给数据编号,快速筛选指定数量的top N数据;
  • 内层LISTAGG(b, ', ') WITHIN GROUP (ORDER BY b):将每个a分组内的b值按升序拼接成逗号分隔的字符串;
  • 外层LISTAGG(...):将每个分组的拼接结果(如N = 25, 30, 40)用分号分隔,合并为单行最终结果。

执行结果

针对你提供的测试数据,执行后会返回单行结果:

N = 25, 30, 40; Y = 26, 48

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 17:16:03