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 子句時候是先分組,然后進行排序,再取出每組的第一條記錄"去重"