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

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;

结果说明

执行任意一种方法后,会得到如下结果:

NameAgeXY
S11AB

如果同一Name下的X存在多个非空值(如'A'和'C'),合并后会显示为A, C,满足将相关记录值合并到单列的需求。


内容的提问来源于stack exchange,提问作者Nagaraju Kukudala

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 16:31:17