sql 刪除重複數據
問題是這樣的。今天在一個技術羣裏,一個羣友提了一個問題:
大概是,一張學生表 student,有字段 id (自增), name, 想要刪除多餘的重複name 的數據,剩下id最小的那條數據。寫個sql 刪除重複數據,同時要兼顧效率。我問他是什麼數據庫,他說是面試遇到的一個問題,沒說什麼數據庫,然後我就說寫個oracle的給他。
主要是我對其他數據庫不熟悉,也不知道是否適用其他數據庫。
於是我寫了以下sql:
delete from student s where s.id in
(select base.id from (
select t.id, row_number() over(partition by t.name order by t.id) tep
from student t
) base where base.tep > 1)
解釋一下:
select t.id, row_number() over(partition by t.name order by t.id) tep from student t
這句是 根據 name 分組,再根據 id排序,獲取組內排序的序號或行號。每組排序是獨立的,最後這個子查詢得到的結果就是 id,name,tep(序號);外層就是查詢出行號 大於1 的,肯定就是重複的需要刪除的數據了。