SQL Server GROUP BY分组查询 非聚合列取单值及列拼接实现
SQL Server 按组返回单值+拼接字符串实现方案
这个需求完全可以实现,之前查询结果不符合预期的核心原因是:你将不需要聚合拼接的col3字段也放入了STRING_AGG函数中,分组查询时聚合函数会遍历组内所有行做计算,因此col3会返回同组所有值拼接的结果。
注意:返回单条col3的前提是你需要明确组内col3的取值规则,以下是两种常见场景的可直接运行的语句:
- 若同一个
featureid分组下所有行的col3值完全一致:直接用任意聚合函数包裹col3即可(因为组内值统一,取最大/最小结果都不会错),col4单独做逗号拼接
SELECT featureid, MAX(col3) AS group_col3, STRING_AGG(col4, ',') AS merged_col4 FROM table_server GROUP BY featureid;
- 若同一个
featureid分组下col3值不统一,需要取指定规则的单条col3(比如取coldatetime时间最新的那条记录的col3):先用窗口函数标记组内符合取值规则的行,再做聚合
WITH temp_mark AS ( SELECT featureid, col3, col4, ROW_NUMBER() OVER (PARTITION BY featureid ORDER BY coldatetime DESC) AS row_rank FROM table_server ) SELECT featureid, MAX(CASE WHEN row_rank = 1 THEN col3 END) AS group_col3, STRING_AGG(col4, ',') AS merged_col4 FROM temp_mark GROUP BY featureid;
提示:
STRING_AGG函数仅支持SQL Server 2017及以上版本,如果你的环境版本更低,需要替换为FOR XML PATH的方式实现字符串拼接。
内容的提问来源于stack exchange,提问作者Bannarisamy Shanmugam
相关产品推荐
相关产品推荐

