SQL Server技术问询:获取唯一记录及合并重复名称记录至单列
SQL Server相关问题解答
问题1:如何在SQL Server中获取唯一记录?
可通过以下几种常用方式实现:
- 使用
DISTINCT关键字:直接过滤整行重复的记录SELECT DISTINCT * FROM 表名; - 使用
GROUP BY:按指定字段分组,对其他字段做聚合处理(适合需要同时计算聚合值的场景)SELECT 字段1, 字段2, MAX(字段3) FROM 表名 GROUP BY 字段1, 字段2; - 使用窗口函数
ROW_NUMBER():为重复组内的记录标记行号,筛选行号为1的记录(适合自定义去重规则的场景)WITH CTE AS ( SELECT *, ROW_NUMBER() OVER(PARTITION BY 去重字段 ORDER BY 排序字段) AS rn FROM 表名 ) SELECT * FROM CTE WHERE rn = 1;
问题2:在SQL Server中,当名称字段存在重复时,如何将所有相关记录显示在单列中?
结合你提供的示例数据,我们需要将同一Name下的非空X值合并,同时保留其他字段的统一值。以下是两种可行实现方式:
示例数据准备
SELECT * INTO #temp FROM ( Select 'S1' Name, '1' Age, 'A' X, 'B' Y UNION ALL Select 'S1', '1', '', 'B' ) A
方法1:使用STRING_AGG(SQL Server 2017及以上版本)
该函数可直接合并分组内的字符串,同时自动过滤空值:
SELECT Name, MAX(Age) AS Age, STRING_AGG(NULLIF(X, ''), ', ') AS X, MAX(Y) AS Y FROM #temp GROUP BY Name;
方法2:使用FOR XML PATH(兼容低版本SQL Server)
通过XML拼接逻辑实现字符串合并:
SELECT t.Name, MAX(t.Age) AS Age, STUFF(( SELECT DISTINCT ', ' + NULLIF(X, '') FROM #temp WHERE Name = t.Name FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)'), 1, 2, '') AS X, MAX(t.Y) AS Y FROM #temp t GROUP BY t.Name;
结果说明
执行任意一种方法后,会得到如下结果:
| Name | Age | X | Y |
|---|---|---|---|
| S1 | 1 | A | B |
如果同一Name下的X存在多个非空值(如'A'和'C'),合并后会显示为A, C,满足将相关记录值合并到单列的需求。
内容的提问来源于stack exchange,提问作者Nagaraju Kukudala
相关产品推荐
相关产品推荐

