1.Distinct
distinct語法: select distinct 字段名稱,字段名稱 from 數據庫名稱
列子
CREATE TABLE userinfo ( id INT PRIMARY KEY IDENTITY NOT NULL, name NVARCHAR(50) NOT NULL, age INT NOT NULL, height INT NOT NULL ) 比如現在有一個用戶表,插入5條臨時數據 如下 INSERT INTO dbo.userinfo SELECT 'xiaogang',23,181 UNION ALL SELECT 'xiaoli',31,176 UNION ALL SELECT 'xiaohei',22,152 UNION ALL SELECT 'xiaogang',26,172 UNION ALL SELECT 'xiaoming',31,176 需求當前用戶表不重復的用戶名 select distinct name from userinfo
結果如下
name
xiaogang
xiaohei
xiaoli
xiaoming
可是我現在又想得到Id的值,改動如下
select distinct name,id from userinfo
結果如下
xiaogang 10
xiaoli 11
xiaohei 12
xiaogang 13
xiaoming 14
distinct怎么沒起作用?作用是起了的,不過他同時作用了兩個
字段,也就是必須得id與name都相同的才會被排除
關鍵字 distinct 只能放在 SQL 語句中所有字段的最前面才能起作用,如果放錯位置,SQL 不會報錯,但也不會起到任何效果
2 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 子句就能將所有的列展示出來,同時進行去重。
總結
1:distinct 和 row_number over 都可以實現去重功能,而distinct 作用於當行的時候,其"去重" 是去掉表中字段所有重復的數據,作用於多行的時候是,其"去重"所有字段都相同的數據。
2:在使用row_number over 子句時候是先分組,然后進行排序,再取出每組的第一條記錄"去重"。