前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >sql语句_ 的三种去重方法

sql语句_ 的三种去重方法

作者头像
Java架构师必看
发布2022-01-11 14:01:53
1K0
发布2022-01-11 14:01:53
举报
文章被收录于专栏:Java架构师必看

大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说sql语句_ 的三种去重方法,希望能够帮助大家进步!!!

本文将介绍用 distict、group by 和 row_number() over 。

注:这里的去重是指:查询的时候, 不显示重复,并不是删除表中的重复项,关系删除表中重复数据的sql 请参考一下链接:

https://www.cnblogs.com/171207xiaohutu/p/11520763.html

  1. distinct

表userinfo 数据如下:

id

name

age

height

10

xiaogang

23

181

11

xiaoli

31

176

12

xiaohei

22

152

13

xiaogang

26

172

14

xiaoming

31

176

代码语言:javascript
复制
现在需要当前用户表不重复的用户名
select distinct name from userinfo
代码语言:javascript
复制
此代码由Java架构师必看网-架构君整理

如结果(1):
name 
xiaogang
xiaohei
xiaoli
xiaoming

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

代码语言:javascript
复制
select distinct name,id from userinfo

如结果(2)

代码语言:javascript
复制
xiaogang 10
xiaoli 11
xiaohei 12
xiaogang 13
xiaoming 14

此时distinct同时作用了两个字段,即必须得id与name都相同的才会被排除

代码语言:javascript
复制
2. group by 
select name 
from userinfo
 groub by name 

运行上面3行sql的结果如上面distinct中的结果(1)

代码语言:javascript
复制
select  name,id
 from userinfo 
groub by name ,id 

运行上面3行sql的结果如上面distinct的结果(2)

代码语言:javascript
复制
3. row_number() over 

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

语法如下:

代码语言:javascript
复制
ROW_NUMBER() OVER(PARTITION BY COLUMN1 ORDER BY COLUMN2)

1:Partition BY 用来分组

2:Order by 用来排序

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

具体SQL 语句如下

代码语言:javascript
复制
SELECT * FROM (
select *,ROW_NUMBER() over(partition by name order by id desc) AS rn from userinfo ) AS u WHERE u.rn=1

结果如下

代码语言:javascript
复制
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 子句就能将所有的列展示出来,同时进行去重。

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 子句时候是先分组,然后进行排序,再取出每组的第一条记录"去重"

今天文章到此就结束了,感谢您的阅读,Java架构师必看祝您升职加薪,年年好运。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档