SQL Server 几种去重总结


1.Distinct  

distinct语法: select distinct 字段名称,字段名称 from 数据库名称

列子 

CREATE TABLE userinfo
(
id INT PRIMARY KEY IDENTITY NOT NULL,
name NVARCHAR(50) NOT NULL,
age INT NOT NULL,
height INT NOT NULL
)
比如现在有一个用户表,插入5条临时数据
如下
INSERT INTO dbo.userinfo SELECT 'xiaogang',23,181 UNION ALL SELECT 'xiaoli',31,176 UNION ALL SELECT 'xiaohei',22,152 UNION ALL SELECT 'xiaogang',26,172 UNION ALL SELECT 'xiaoming',31,176

需求当前用户表不重复的用户名

select distinct name from userinfo

结果如下

name

xiaogang
xiaohei
xiaoli
xiaoming

可是我现在又想得到Id的值,改动如下

select distinct name,id from userinfo

结果如下

xiaogang 10
xiaoli 11
xiaohei 12
xiaogang 13
xiaoming 14

distinct怎么没起作用?作用是起了的,不过他同时作用了两个

字段,也就是必须得id与name都相同的才会被排除

关键字 distinct 只能放在 SQL 语句中所有字段的最前面才能起作用,如果放错位置,SQL 不会报错,但也不会起到任何效果

 

2 Row_Number() over 

SQL Server 通过Row_Number 函数给数据库表的记录进行标号,在使用的时候后面会跟over 子句,而over 子句主要用来对表中的记录进行分组和排序的。

语法如下:

ROW_NUMBER() OVER(PARTITION BY COLUMN1 ORDER BY COLUMN2)

1:Partition BY 用来分组

2:Order by 用来排序

接下来用 row_number() over 进行去重。首先用name 进行分组,id进行排序。

具体SQL 语句如下

SELECT * FROM (
select *,ROW_NUMBER() over(partition by name order by id desc) AS rn from userinfo ) AS u WHERE u.rn=1

 

结果如下

id  name   age height rn

13 xiaogang 26 172 1
12 xiaohei 22 152 1
11 xiaoli 31 176 1
14 xiaoming 31 176 1

 

通过使用 row_number over 子句就能将所有的列展示出来,同时进行去重。

 

总结

1:distinct 和 row_number over 都可以实现去重功能,而distinct 作用于当行的时候,其"去重" 是去掉表中字段所有重复的数据,作用于多行的时候是,其"去重"所有字段都相同的数据。

2:在使用row_number over 子句时候是先分组,然后进行排序,再取出每组的第一条记录"去重"。 

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM