搜索
您的当前位置:首页正文

SQL数据去重复Distinct和row_number()over()

来源:抵帆知识网
SQL数据去重复Distinct和row_number()over()

Distinct:查询结果中,去掉了重复的⾏1.语法:

SELECT Distinct列名称 FROM 表名称;

Distinct 必须放在Select搜索字段的最前⾯,否则SQL语句会报语法错误。2.⽰例:

2.1简单建⽴⼀个表,填⼊数据,执⾏SQL: Select * From [BlogDemo].[dbo].[People],结果如下:

2.2 单独查询Name字段,执⾏SQL:Select Name From [BlogDemo].[dbo].[People],结果如下:

2.3 上⾯查询结果的Name中\"李丽\"出现了3次,可以使⽤Distinct 关键字去重复,执⾏SQL:Select distinct Name From [BlogDemo].[dbo].[People],结果如下:

2.4 上⾯查询结果中可以看到,Distinct 关键字去重复的作⽤实现了。如果在去重复Name的需求下还需要查询其他所有字段,会出现什么结果,执⾏SQL:Select distinct Name,Age,Address From [BlogDemo].[dbo].[People],结果如下:

2.5 可以看到Distinct 关键字去重复作⽤并没有什么卵⽤,当 Distinct 作⽤在多个字段的时候,它只会将所有字段值都相同的记录“去重”掉,下⾯验证下,在表中在插⼊⼀条数据,如下:

2.6 新插⼊数据第8条和第1条数据内容完全相同,再次执⾏SQL:Select distinct Name,Age,Address From [BlogDemo].[dbo].[People],结果如下:

2.7 可以看到第8条数据被去重了,所以:当 Distinct 作⽤在多个字段的时候,它只会将所有字段值都相同的记录“去重”掉。在我们实际开发中,表中可能含有多条拥有相同某个字段的记录,如同⽰例中的Name字段,如果我们只需要相同Name的⼀个数据怎么办呢?

row_number() over() 函数:对结果集的输出进⾏编号。返回结果集分区内⾏的序列号,每个分区的第⼀⾏从 1 开始1.语法:

ROW_NUMBER ( ) OVER ( [ PARTITION BY value_expression , ... [ n ] ] order_by_clause )

2.参数:

PARTITION BY value_expression:将 FROM ⼦句⽣成的结果集划分为应⽤ ROW_NUMBER 函数的分区。 value_expression 指定对结果集进⾏分区所依据的列。 如果未指定 PARTITION BY,则此函数将查询结果集的所有⾏视为单个组。 (PARTITION BY作⽤相似Group By分组的效果) 。

order_by_clause:ORDER BY ⼦句可确定在特定分区中为⾏分配唯⼀ ROW_NUMBER 的顺序。 它是必需的。3.⽰例:

3.1 依旧使⽤上⾯的People表,先不加PARTITION BY分组的效果,执⾏SQL:Select *,ROW_NUMBER() OVER(Order By Id) as row From[BlogDemo].[dbo].[People],可以看到查询的结果集有8组,最后⼀列加⼊了row字段标识,结果如下:

3.2 加⼊PARTITION BY分组的效果,执⾏SQL:Select *,ROW_NUMBER() OVER(Partition By Name Order By Id) as row From [BlogDemo].[dbo].

[People],可以看到这次结果集只有4组,Name为\"李丽\"全部被标识为4组,结果如下:

3.3 如果我们只取Name字段相同数据的⼀组,只要加⼀个筛选条件分组row为1即可,执⾏SQL:Select * From (Select *,ROW_NUMBER()OVER(Partition By Name Order By Id) as row From [BlogDemo].[dbo].[People]) p Where p.row=1,这时候结果集中Name不会出现相同的数据了,结果如下:

总结:

Distinct 和 row_number() over() 都有将数据去重复的作⽤,但Distinct 只能作⽤于单个字段查询结果集去重复,若针对多个字段查询的结果集去重复,需要所有字段都重复才可以去重复。row_number() over() 函数具有分组效果,⽆论是对于单字段还是多字段查询结果集去重复都可以做到。

因篇幅问题不能全部显示,请点此查看更多更全内容

Top