一、使用 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);