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

如何在SQL Server中去除相邻重复行(无分区辅助列)

解决SQL Server中移除相邻重复值的问题

要实现移除序列中相邻重复的值(保留不同分段的重复值),我们可以借助窗口函数来对比当前行与前一行的值,具体步骤如下:

1. 构造测试数据(模拟你的序列)

首先我们创建临时表并插入示例数据:

CREATE TABLE #Fruits (FruitName VARCHAR(20));
INSERT INTO #Fruits VALUES
('Orange'),('Orange'),('Orange'),
('Apple'),('Apple'),('Apple'),
('Orange'),('Orange'),
('Grapes'),('Grapes');

2. 使用CTE+窗口函数实现去重逻辑

核心思路是先给每行数据分配行号确定顺序,再用LAG()函数获取前一行的水果名称,筛选出与前一行不同的记录(或第一行):

WITH NumberedFruits AS (
    SELECT 
        FruitName,
        -- 注意:如果你的表有实际排序列(比如主键ID、插入时间),请替换成该列,避免用SELECT NULL的不稳定排序
        ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS RowNum
    FROM #Fruits
)
SELECT FruitName
FROM NumberedFruits
WHERE 
    RowNum = 1  -- 保留第一行
    OR FruitName != LAG(FruitName) OVER (ORDER BY RowNum);  -- 当前行与前一行不同则保留

3. 结果说明

执行上述SQL后,输出结果就是:

Orange
Apple
Orange
Grapes

完全符合你要求的保留不同分段重复值的需求。

重要注意事项

  • 排序的稳定性:ORDER BY (SELECT NULL)是临时测试用的不稳定排序方式,实际生产环境中必须使用表中存在的、能确定数据顺序的列(比如自增ID、创建时间戳),否则可能导致结果顺序混乱。
  • 窗口函数兼容性:LAG()函数从SQL Server 2012及以上版本开始支持,如果你的版本低于2012,可以用ROW_NUMBER()关联自身表来实现类似逻辑(比如通过RowNum = t2.RowNum -1来匹配前一行)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 13:17:50