DB2 SQL如何利用LISTAGG实现分条件取Top值并合并为单行
DB2 SQL 实现指定数据提取与LISTAGG合并方案
实现思路
- 用窗口函数按
a分组,每组内按c降序排名,筛选出a=N的前3条、a=Y的前2条数据; - 对筛选后的
b值按a分组,升序排列后用LISTAGG合并为组内字符串; - 最终将各组结果合并为单行目标格式。
完整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
相关产品推荐
相关产品推荐

