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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM