如何按ExportID/导出时间将多行合并为逗号分隔的单行记录
实现需求的SQL方案
根据你提供的表结构和需求,以下是不同数据库系统下,按ExportID/Action Time分组并合并Index Value为逗号分隔字符串的SQL写法:
MySQL(5.7及以上版本)
使用GROUP_CONCAT函数完成字符串聚合:
SELECT e.ExportID, e.`Action Time`, GROUP_CONCAT(i.`Index Value` SEPARATOR ', ') AS Merged_Index_Values FROM `Export Table` e JOIN `Index Table` i ON e.`Index ID` = i.`Index ID` GROUP BY e.ExportID, e.`Action Time`;
如果需要对聚合的Index Value去重或指定排序,可修改聚合部分为:
GROUP_CONCAT(DISTINCT i.`Index Value` ORDER BY i.`Index Value` SEPARATOR ', ')
SQL Server(2017及以上版本)
使用STRING_AGG函数实现:
SELECT e.ExportID, e.[Action Time], STRING_AGG(i.[Index Value], ', ') WITHIN GROUP (ORDER BY i.[Index Value]) AS Merged_Index_Values FROM [Export Table] e JOIN [Index Table] i ON e.[Index ID] = i.[Index ID] GROUP BY e.ExportID, e.[Action Time];
需去重则添加DISTINCT关键字:
STRING_AGG(DISTINCT i.[Index Value], ', ') WITHIN GROUP (ORDER BY i.[Index Value])
PostgreSQL
同样使用STRING_AGG函数:
SELECT e."ExportID", e."Action Time", STRING_AGG(i."Index Value", ', ' ORDER BY i."Index Value") AS Merged_Index_Values FROM "Export Table" e JOIN "Index Table" i ON e."Index ID" = i."Index ID" GROUP BY e."ExportID", e."Action Time";
去重版本:
STRING_AGG(DISTINCT i."Index Value", ', ' ORDER BY i."Index Value")
注意事项
- 你期望结果中包含的
SMS对应Index ID333,但现有导出表中没有关联该Index ID的记录,需确认是否存在数据遗漏或关联规则调整的需求。 - 若仅需按
Action Time分组,只需将GROUP BY子句改为GROUP BY e."Action Time"(对应数据库的字段引用格式)即可。
内容的提问来源于stack exchange,提问作者Tamara Lancaster
相关产品推荐
相关产品推荐

