寫這個問題是最近我參加過一次面試 主考官問我一個經典的 重複數據 查詢 刪除的問題。面試完後,我感覺這次面試相當失敗,具體不說了,看下面的問題吧。
以下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 ) 排序 語句介紹
比較經典的並且好記得 我覺得是 許多個班級,要你計算每個班級分數前幾名的排序 計算第一名 第二名
然後要你查詢出每個班級的名次情況 等等