sql 刪除重複數據

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 的,肯定就是重複的需要刪除的數據了。

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