SQL server 2008下 重複數據的刪除

      寫這個問題是最近我參加過一次面試  主考官問我一個經典的 重複數據 查詢  刪除的問題。面試完後,我感覺這次面試相當失敗,具體不說了,看下面的問題吧。

以下SQL 在SQL server 2008 管理平臺下

表很簡單

CREATE TABLE [dbo].[user](
 [id] [int] ,
 [name] [nvarchar](50)

)

用戶表   2個列   一個列ID  一個是ID的姓名   沒有主鍵 ,當然有主鍵的情況另外說

 

先看沒有主鍵的情況 ,這種情況的數據非常亂,這個表的數據完全可能有以下情況 

insert into user  values('1','x')
insert into user  values('1','x')

insert into user values('2','x')
insert into user values('2','x')


insert into user values('3','x')
insert into user values('3','x')

 


insert into user values('1','y')
insert into user values('1','y')

insert into user values('2','y')
insert into user values('2','y')


insert into user values('3','y')
insert into user  values('3','y')

 

有個人x 他的id 1,2,3 並且ID是重複   y 和x 一樣的情況

 

現在要你刪除這些重複的值  但是同一個name  只需要保留一個最大的那個ID

結果就是

ID  NAME

 3   x 

 3   y

不允許創建額外的臨時表 中間表   只用select 語句,想了下 比較有難度  說了這麼說其實就是 兩個(多個)一模一樣的記錄 

你需要刪其中的N條但是隻要保留其中的一條

select * from
(select id,name,ROW_NUMBER() over(partition by name order by id desc ) as mc from user  ) t
where t.mc>'1'

 

或者 desc  asc 降序  升序 

select * from
(select id,name,ROW_NUMBER() over(partition by name order by id desc  ) as mc from user  ) t
where t.mc='1'

 

 數據查詢出來了    現在是如何去刪除重複的數據  

嘗試寫了下面幾個查詢

 select *  from user  a where a.ID<(select MAX(id) from user  b  where a.name=B.name )  

select *  from user  a where a.ID=(select MAX(id) from user  b  where a.name=B.name )  

 

查詢效果不一樣

 對於一個x 對應 11,22,33  這個語句保留一些重複的 把 select  * 改成 delete 刪除的是小於的  但是等於的重複數據還是保留了  

 刪除沒有刪完整  對於第一種  能查詢出來  但是刪除的SQL

 

WITH XX  AS
(
select * from
(select id,name,ROW_NUMBER() over(partition by name order by id desc) as mc from user ) t
where t.mc>1'

)
SELECT *    FROM XX

先看查詢結果    

 

 

然後 把 select *  改delete  能夠實現刪除重複數據

 

關鍵是 涉及到 row_number()    rank()   over(partition by order by  ) 排序   語句介紹  

比較經典的並且好記得    我覺得是 許多個班級,要你計算每個班級分數前幾名的排序  計算第一名  第二名 

然後要你查詢出每個班級的名次情況  等等

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章