SQL Server 幾種去重總結

2021-10-08 05:25:52 字數 3295 閱讀 9574

sql 單錶/多表查詢去除重覆記錄

單錶distinct

多表group by

group by 必須放在 order by 和 limit之前,不然會報錯

1.distinct: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

)比如現在有乙個使用者表,插入條臨時資料

如下: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 子句就能將所有的列展示出來,同時進行去重。

3. group by

語句如下

a、select name from userinfo groub by name

執行上面sql的結果如

name

xiaogang

xiaohei

xiaoli

xiaoming

b、select name,id from userinfo groub by name ,id

執行上面sql的結果如

xiaogang 10

xiaoli 11

xiaohei 12

xiaogang 13

xiaoming 14

總結

distinct 和row_number over()區別:

(1)distinct 和 row_number over 都可以實現去重功能,而distinct 作用於當行的時候,其"去重" 是去掉表中字段所有重複的資料,作用於多行的時候是,其"去重"所有欄位都相同的資料。

(2)在使用row_number over 子句時候是先分組,然後進行排序,再取出每組的第一條記錄"去重"。

distinct 和group by 的區別:

(1)distinct常用來查詢不重覆記錄的條數:count(distinct name),group by 常用它來返回不重記錄的所有值。

(2)在使用group by 分組後,在select中可以選擇分組字段,和非分組欄位的函式值,如 max()、min()、sum、count()等

sql只根據某一字段去重,並保留其他字段

sql只根據某乙個欄位去重並保留其他字段,要實現此需求的關鍵是用到兩個函式,分別為:group by 與 max()

group by的目的是分組從而達到去重的效果,max()的目的是取分組重複的字段中取出隨機的一條資料(比如說這裡用的max()意思是取某一欄位最大的,或者也可以用其他只能獲取一條資料的函式,這裡要根據具體的需求來決定)

sql寫法如下:

比如表user中有字段:id、name、age

id name age

1 張三 22

2 李四 23

3 王五 22

4 馬六 24

5 徐七 23

我們想要查根據age去重的乙個資料,並且name隨機取乙個id最大的即可,期望結果如下:

id name age

3 王五 22

4 馬六 24

5 徐七 23

sql為:

select id,name,age from user a where id in ( select max(id) as id from user b group by age )

或者用exists:

select id,name,age from user a where exists ( select id from ( select max(id) as id from user group by age ) b where a.id = b.id )

SQL Server 去重處理

asbegin set nocount on 不返回計數,提高處理速度 set xact abort on 如果出錯,會將transcation設定為uncommittable狀態 begin tran declare fn varchar 200 檔名 declare rn int 記錄號 dec...

sqlserver記錄去重

insert into employee select2,emp name gender department salary from employee select from select row number over partition by emp id order by emp id em...

去重簡單幾種方法

第一種 array unique 移除陣列中重複的值 input array a green red b green blue red result array unique input print r result 以上例程會輸出 array a green 0 red 1 blue 第二種 交換...