如何编写SQL语句实现重复值分组的字符串拼接?已尝试Rank/Row_Number无效
实现SQL列数据按分组拼接字符串
给定某列的数据如下:
1 2 3 1 4 5
期望输出将连续的分组(以值1作为分组起始)拼接为单行:
123 145
核心思路
要实现这个需求,关键是先以1的出现位置划分分组,再对每个分组内的数值进行字符串拼接。Rank/Row_Number函数无法直接完成这种基于特定值的分组,需要用累加窗口函数标记分组ID。
具体实现步骤
1. 生成分组ID
首先给每行分配分组ID:每遇到值为1的行,就开启一个新分组。假设你的表有自增主键id用于排序(如果没有,可根据数据插入顺序或其他有序列调整),用SUM()窗口函数实现:
SELECT value, SUM(CASE WHEN value = 1 THEN 1 ELSE 0 END) OVER (ORDER BY id) AS group_id FROM your_table;
执行后会得到带分组标识的中间结果:
| value | group_id |
|---|---|
| 1 | 1 |
| 2 | 1 |
| 3 | 1 |
| 1 | 2 |
| 4 | 2 |
| 5 | 2 |
2. 按分组拼接字符串
根据你使用的数据库,选择对应的字符串聚合函数:
MySQL/MariaDB
使用GROUP_CONCAT():
SELECT GROUP_CONCAT(value ORDER BY id SEPARATOR '') AS result FROM ( SELECT value, SUM(CASE WHEN value = 1 THEN 1 ELSE 0 END) OVER (ORDER BY id) AS group_id FROM your_table ) t GROUP BY group_id;
SQL Server
使用STRING_AGG():
SELECT STRING_AGG(value, '') WITHIN GROUP (ORDER BY id) AS result FROM ( SELECT value, SUM(CASE WHEN value = 1 THEN 1 ELSE 0 END) OVER (ORDER BY id) AS group_id FROM your_table ) t GROUP BY group_id;
PostgreSQL
使用STRING_AGG()(注意将数值转为文本):
SELECT STRING_AGG(value::TEXT, '' ORDER BY id) AS result FROM ( SELECT value, SUM(CASE WHEN value = 1 THEN 1 ELSE 0 END) OVER (ORDER BY id) AS group_id FROM your_table ) t GROUP BY group_id;
Oracle
使用LISTAGG():
SELECT LISTAGG(value, '') WITHIN GROUP (ORDER BY id) AS result FROM ( SELECT value, SUM(CASE WHEN value = 1 THEN 1 ELSE 0 END) OVER (ORDER BY id) AS group_id FROM your_table ) t GROUP BY group_id;
内容的提问来源于stack exchange,提问作者Vinnodh Padma
相关产品推荐
相关产品推荐

