如何按分组将每n行数据用string_agg()实现字符串聚合?
解决方法
核心思路是先给每个分组内的行分配连续序号,再根据序号将每n行划分为一个子组,最后对子组进行聚合。
实现代码(以n=3为例)
WITH numbered_data AS ( SELECT first_name, data_id, -- 按first_name分组,给每行分配序号(排序字段可根据实际需求调整) ROW_NUMBER() OVER (PARTITION BY first_name ORDER BY data_id) AS rn FROM #temp ), grouped_data AS ( SELECT first_name, data_id, -- 计算子组编号:每3行一组,不足3行自动归为最后一组 (rn - 1) / 3 AS group_num FROM numbered_data ) SELECT first_name, STRING_AGG(data_id, ',') AS data_id FROM grouped_data GROUP BY first_name, group_num ORDER BY first_name, group_num;
代码说明
- numbered_data CTE:使用
ROW_NUMBER()窗口函数,按first_name分组后给每行分配唯一序号,ORDER BY data_id可根据业务需求替换为其他排序字段(如插入时间)。 - grouped_data CTE:通过
(rn - 1) / n计算子组编号,这里n=3,因此序号1-3会被归为同一子组,4-6归为下一个子组,以此类推,实现每n行聚合的效果。 - 最终查询:按
first_name和子组编号group_num分组,用STRING_AGG()聚合data_id,得到目标结果。
调整分组行数
如果需要修改每组的行数(比如n=2),只需将(rn - 1) / 3中的3替换为对应的n值即可。
内容的提问来源于stack exchange,提问作者Coldchain9
相关产品推荐
相关产品推荐

