博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
sql语句_ 的三种去重方法
阅读量:4677 次
发布时间:2019-06-09

本文共 1678 字,大约阅读时间需要 5 分钟。

本文将介绍用 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 xiaogang xiaohei xiaoli xiaoming

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

转载于:https://www.cnblogs.com/171207xiaohutu/p/11520759.html

你可能感兴趣的文章
FIR滤波器的verilog实现方法
查看>>
display的值和对应的意义
查看>>
HashSet、LinkHashSet、TreeSet总结
查看>>
手机号码输入格式化,数字三三四的输入;手机正则校验输入是否合理及提示;...
查看>>
抽象类
查看>>
CSS3 背景
查看>>
WPF DataGrid 之数据绑定
查看>>
c语言之gdb调试。
查看>>
位反转的最佳算法
查看>>
常用面试问题
查看>>
第一个爬虫
查看>>
Java面试知识点之Java基础
查看>>
老外的前端面试题
查看>>
架构:新浪架构师谈微博架构
查看>>
SQL 语句速查
查看>>
女孩·有义务让男孩走向成熟,·男孩·有责任让女孩学着长大(精简版)
查看>>
discuz 删除指定条件的资讯
查看>>
Android上下文菜单ContextMenu
查看>>
JavaScript Number 对象 Javascript Array对象 Location 对象方法 String对象方法
查看>>
Python & Django 学习笔记
查看>>