sql三种去重查询
经常有用到在这里总结一下三种去重查询distict、group by 和row_number()over。
1、distinct
表student数据如下
id | name | gender | fraction |
1 | 张三 | 男 | 88 |
2 | 李四 | 女 | 99 |
3 | 赵五 | 男 | 66 |
4 | 张飞 | 男 | 88 |
5 | 张三 | 女 | 99 |
6 | 李四 | 女 | 857 |
查出不重复的name与fraction的值
select distinct name,fraction from student
结果:
张三 88
李四 99
赵五 66
2、group by
select name,fraction from student grout by name、fraction
结果如上面的distinct一样
3、row_number() over
slq 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
结果如下:
1 张三 男 88
2 李四 女 99
3 赵五 男 66
4 张飞 男 88
4.思考
distinct 和group by 的区别:
(1)distinct常用来查询不重复记录的条数:count(distinct name),group by 常用它来返回不重记录的所有值。
(2)在使用group by 分组后,在select中可以选择分组字段,和非分组字段的函数值,如 max()、min()、sum、count()等
distinct 和row_number over()区别:
(1)distinct 和 row_number over 都可以实现去重功能,而distinct 作用于当行的时候,其"去重" 是去掉表中字段所有重复的数据,作用于多行的时候是,其"去重"所有字段都相同的数据。
(2)在使用row_number over 子句时候是先分组,然后进行排序,再取出每组的第一条记录"去重"
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)