如何按出现顺序拼接唯一值?SQL查询实现求助
按出现顺序拼接唯一值的SQL实现
需求说明
需要将表中目标列的唯一值按首次出现的顺序拼接成字符串,即去除重复值后,保留原始出现顺序并拼接为单个字符串。
不同数据库的实现方案
1. MySQL(8.0+版本)
利用窗口函数标记首次出现的记录,再通过分组拼接得到结果:
WITH ranked_data AS ( SELECT target_column, ROW_NUMBER() OVER (PARTITION BY target_column ORDER BY sort_column) AS rn FROM your_table ) SELECT GROUP_CONCAT(target_column ORDER BY MIN(sort_column) SEPARATOR ',') AS concatenated_unique_values FROM ranked_data WHERE rn = 1;
注:sort_column为表中能确定记录顺序的列(如自增ID、时间戳),your_table替换为实际表名,target_column替换为需要处理的列名
2. PostgreSQL
通过DISTINCT ON筛选首次出现的记录,再用字符串聚合函数拼接:
SELECT STRING_AGG(target_column, ',' ORDER BY sort_column) AS concatenated_unique_values FROM ( SELECT DISTINCT ON (target_column) target_column, sort_column FROM your_table ORDER BY target_column, sort_column ) AS first_occurrences;
3. SQL Server(2017+版本)
用窗口函数筛选首次出现的记录,再进行字符串聚合:
WITH ranked_data AS ( SELECT target_column, ROW_NUMBER() OVER (PARTITION BY target_column ORDER BY sort_column) AS rn, sort_column FROM your_table ) SELECT STRING_AGG(target_column, ',' ORDER BY MIN(sort_column)) AS concatenated_unique_values FROM ranked_data WHERE rn = 1;
关键注意点
- 必须依赖一个能确定记录顺序的列(如自增ID、创建时间),否则无法保证"按出现顺序"的准确性
- 不同数据库的字符串拼接函数存在差异:MySQL使用
GROUP_CONCAT,PostgreSQL和SQL Server使用STRING_AGG
内容的提问来源于stack exchange,提问作者Dimple
相关产品推荐
相关产品推荐

