sql三种去重查询 distict、group by 和row_number()over。

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

参考:https://www.cnblogs.com/171207xiaohutu/p/11520759.html