You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写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;

执行后会得到带分组标识的中间结果:

valuegroup_id
11
21
31
12
42
52

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 22:14:55