oracle數據庫去重,只保留一條數據


一、使用 Row_Number() Over(Partition By ... Order By ...) 為每個分組生成一個內部序號

第一步,根據需求查詢重復數據,並為每個分組生成一個內部行號

Select t.*,
       Row_Number() Over(Partition By Visit_Id, Presc_Detail_Id, Rule_Code Order By t.Visit_Id) Su
  From Test t;

第二步,篩選出行號大於1的,即重復的多余的數據

Select *
  From (Select t.*,
               Row_Number() Over(Partition By Visit_Id, Presc_Detail_Id, Rule_Code Order By t.Visit_Id) Su
          From Test t)
 Where Su > 1;

第三步,刪除重復數據,只保留1條

Delete From Test
 Where Id In (Select Id
                From (Select t.*,
                             Row_Number() Over(Partition By Visit_Id, Presc_Detail_Id, Rule_Code Order By t.Visit_Id) Su
                        From Test t)
               Where Su > 1);

這種方式有個弊端,如果數據本身並沒有每行的唯一標識id,刪除重復數據還是非常困難的。

 

二、使用 ROWID

第一步,查找重復的記錄

Select *
  From Test t
 Where (Visit_Id, Presc_Detail_Id, Rule_Code) In
       (Select Visit_Id, Presc_Detail_Id, Rule_Code
          From Test
         Group By Visit_Id, Presc_Detail_Id, Rule_Code
        Having Count(*) > 1)
 Order By Visit_Id, Presc_Detail_Id, Rule_Code;

第二步,查找表中多余的重復記錄,不包含rowid最小的記錄

Select *
  From Test t
 Where (Visit_Id, Presc_Detail_Id, Rule_Code) In
       (Select Visit_Id, Presc_Detail_Id, Rule_Code
          From Test
         Group By Visit_Id, Presc_Detail_Id, Rule_Code
        Having Count(*) > 1)
   And Rowid Not In (Select Min(Rowid)
                       From Test
                      Group By Visit_Id, Presc_Detail_Id, Rule_Code
                     Having Count(*) > 1);

第三步,刪除表中多余的重復記錄,只保留rowid最小的記錄

Delete From Test t
 Where (Visit_Id, Presc_Detail_Id, Rule_Code) In
       (Select Visit_Id, Presc_Detail_Id, Rule_Code
          From Test
         Group By Visit_Id, Presc_Detail_Id, Rule_Code
        Having Count(*) > 1)
   And Rowid Not In (Select Min(Rowid)
                       From Test
                      Group By Visit_Id, Presc_Detail_Id, Rule_Code
                     Having Count(*) > 1);

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM