如何在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
相关产品推荐
相关产品推荐

