本文將介紹用 distict、group by 和 row_number() over 。html
注:這裏的去重是指:查詢的時候, 不顯示重複,並非刪除表中的重複項,關係刪除表中重複數據的sql 請參考一下連接:sql
https://www.cnblogs.com/171207xiaohutu/p/11520763.html數據庫
1. distinct函數
表userinfo 數據以下:spa
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的值,改動以下code
select distinct name,id from userinfohtm
如結果(2)blog
xiaogang 10
xiaoli 11
xiaohei 12
xiaogang 13
xiaoming 14排序
此時distinct同時做用了兩個字段,即必須得id與name都相同的纔會被排除it
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 子句時候是先分組,而後進行排序,再取出每組的第一條記錄"去重"