Sqlserver 使用row_number()over(partitioon by) 分组去重

 更新时间:2026年07月16日 09:27:05   作者:农村小镇哥  
本文带你彻底搞懂row_number()窗口函数,结合partition by和order by,轻松实现组内编号、排名提取,还能巧妙去除重复数据,感兴趣的可以了解一下

‌row_number() over (partition by order by) 是一种‌SQL窗口函数,在Oracle、Hive 以及mysql8.0以上版本可以使用,用于在每个分区内对每一行进行排序并编号,从1开始编号,赋予其连续的编号。它一般用于分析和报表等场景,可以帮助我们对数据进行分区后排序,获取排名信息。

row_number() 函数搭配partition by与order by函数可以完成以下功能。

对查询结果集中的每一行分配一个唯一的数字,从1开始编号。
结合partition by可以先对结果进行分组,然后组内每条数据再从1开始编号。
应用场景:比如学校考试结束后,按科目进行分组,每个科目按成绩进行排序,获取前十名。

总结:row_numer是一个分组排序函数,可以对查询结果集先进行分组,然后每组内再进行排序。对每个分组内的每行分配一个从1开始的连续唯一编号。

在查询数据时如果有重复,我们知道可以用 distinct 去除重复值,但使用 distinct 只能去除所有查询列都相同的记录,如果有一个字段不同,distinct 就无法去重。

select  ID , 编码, 姓名 from person where 姓名='李四'

但我们还想要实现这样的效果,这时我们可以用 row_number()over(partitioon by column1 order by column2) 先进行分组。根据 COLUMN1 分组,在分组内部根据 COLUMN2 排序,结果表示为每组内部排序后的顺序编号,这个编号在组内是连续且的。

select  ID , 编码, 姓名 
,ROW_NUMBER()over(partition by 姓名 order by ID desc) as new_id --对姓名进行分组,对id进行从大到小排序
from person where name='李四'

再根据新生成的值作为条件,取出每组中的某个值。通常情况下取大值或小值,其它情况看需求。

一般将上述语句,看做为一个新表,如临时表,或外嵌查询 select。以临时表为例。

select  ID , 编码, 姓名 
,ROW_NUMBER()over(partition by 姓名 order by ID desc) as new_id --对姓名进行分组,对id进行从大到小排序
into #aa
from person where name='李四'
select * from #aa where new_id=1

就是为了去除重复值。将重复值分组,按大值排序,取条。

到此这篇关于Sqlserver 使用row_number()over(partitioon by) 分组去重的文章就介绍到这了,更多相关row_number()over(partitioon by) 分组去重内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

最新评论