SQLServer⼏种去重总结
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
select distinct fromxiaohei 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 =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 ⼦句时候是先分组,然后进⾏排序,再取出每组的第⼀条记录"去重"。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。