SQL实现同分组所有值拼接为新字段的方法问询
SQL实现方案
核心逻辑是使用窗口聚合函数替代普通GROUP BY分组,既可以按id分组完成组内排序拼接,又能完整保留原表的所有行,且同id分组下所有行返回一致的拼接结果。
以下是不同主流数据库的实现代码,假设你的表名为t,时间戳字段名为ts,可根据实际字段名替换:
MySQL 8.0+/MariaDB
SELECT id, att_1, ts, GROUP_CONCAT(att_1 ORDER BY ts ASC SEPARATOR ',') OVER (PARTITION BY id) AS att_2 FROM t;
PostgreSQL
SELECT id, att_1, ts, STRING_AGG(att_1, ',' ORDER BY ts ASC) OVER (PARTITION BY id) AS att_2 FROM t;
SQL Server 2017及以上
SELECT id, att_1, ts, STRING_AGG(att_1, ',') WITHIN GROUP (ORDER BY ts ASC) OVER (PARTITION BY id) AS att_2 FROM t;
Hive/Spark SQL
SELECT id, att_1, ts, CONCAT_WS(',', COLLECT_LIST(att_1) OVER ( PARTITION BY id ORDER BY ts ASC ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING )) AS att_2 FROM t;
注意事项
- 若同id、同时间戳的att_1值需要去重,可在聚合函数中加入
DISTINCT关键字,例如MySQL中改为GROUP_CONCAT(DISTINCT att_1 ORDER BY ts ASC SEPARATOR ',') - MySQL默认
GROUP_CONCAT的最大拼接长度为1024字节,若拼接内容过长,需提前执行SET group_concat_max_len = 1000000;调整长度限制(数值可按需修改)
内容的提问来源于stack exchange,提问作者Oliver
相关产品推荐
相关产品推荐

