sql语句_ 的三种去重方法

Easter79
• 阅读 1491

本文将介绍用 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

现在需要当前用户表不重复的用户名select distinct name from userinfo

如结果(1):name xiaogangxiaoheixiaolixiaoming

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

select distinct name,id from userinfo

如结果(2)

xiaogang 10
xiaoli 11
xiaohei 12
xiaogang 13
xiaoming 14

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

2. group by

select name

from userinfo

groub by name

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

select  name,id

from userinfo

groub by name ,id 

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

3. 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 WHERE u.rn=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 子句就能将所有的列展示出来,同时进行去重。

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

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
添砖java的啾 添砖java的啾
3年前
distinct效率更高还是group by效率更高?
目录00结论01distinct的使用02groupby的使用03distinct和groupby原理04推荐groupby的原因00结论先说大致的结论(完整结论在文末):在语义相同,有索引的情况下groupby和distinct都能使用索引,效率相同。在语义相同,无索引的情况下:distinct效率高于groupby。原因是di
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Easter79 Easter79
3年前
sql注入
反引号是个比较特别的字符,下面记录下怎么利用0x00SQL注入反引号可利用在分隔符及注释作用,不过使用范围只于表名、数据库名、字段名、起别名这些场景,下面具体说下1)表名payload:select\from\users\whereuser\_id1limit0,1;!(https://o
LosAngel LosAngel
3年前
MySql 查询重复数大于1的数据(HAVING的使用)
在数据增加的过程中,因为某些原因,会产生重复数据,此时我们要看哪些数据重复了。举栗:要操作的表为test主键id需要排重的字段为field1,field2,field3,field4SQL语句为SELECT,count(id)FROMsysuser_user_pointlog_online_bakGROUPB
Wesley13 Wesley13
3年前
SQL 常用函数使用
DISTINCT  Distinct去重复。性能上和GROUPBY差异据说有点点优势,GROUPBY存在毕竟不是用来去重的,GROUPBY用作分组,当然可以做去重动作selectDISTINCT列1,列2...from数据库.dbo.表名/结果:
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
Oracle一张表中实现对一个字段不同值和总值的统计(多个count)
需求:统计WAIT\_ORDER表中的工单总数、未处理工单总数、已完成工单总数、未完成工单总数。表结构:为了举例子方便,WAIT\_ORDER表只有两个字段,分别是ID、STATUS,其中STATUS为工单的状态。1表示未处理,2表示已完成,3表示未完成总数。 SQL:  1.SELECT   2
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
Easter79
Easter79
Lv1
今生可爱与温柔,每一样都不能少。
文章
2.8k
粉丝
5
获赞
1.2k