sql語句 的三種去重方法


本文將介紹用 distict、group by 和 row_number() over 。

注:這里的去重是指:查詢的時候, 不顯示重復,並不是刪除表中的重復項,關系刪除表中重復數據的sql 請參考一下鏈接:

https://www.cnblogs.com/songqh-123/p/12218762.html

1. distinct

表userinfo 數據如下:

現在需要當前用戶表不重復的用戶名
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://i-beta.cnblogs.com/posts/edit


免責聲明!

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



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