原文參考:https://www.cnblogs.com/tracer-dhy/p/10664327.html
按stIdCard,stYear,semester划分,刪除每個學生每學年的重復數據,並保留rowid最小的一條記錄(也可以是其他條件的一條記錄)
delete
from a_h_mid b
where b.stu_id in
(select a.stu_id from
(select stName, stu_id,rowid, stIdCard,stYear,semester
from a_h_mid
where (stIdCard,stYear,semester) in
(select stIdCard,stYear,semester
from a_h_mid
group by stIdCard,stYear,semester
having count(*) > 1)
and rowid not in
(select min(rowid)
from ( a_h_mid )
group by stIdCard,stYear,semester
having count(*) > 1) ) a )
一、a_h_mid為源數據表,記錄的是學生每學期的成績,但個學期可能會異常產生多條數據,比如一學期有兩條語文成績,所以需要去重操作。
二、按學生證件號stIdCard、學年stYear、學期semester三個字段為依據,查看是否有重復記錄。
select stIdCard,stYear,semester from a_h_mid group by stIdCard,stYear,semester having count(*) > 1
三、保留想要的數據,這里是隨便保留了一個rowid最小的記錄,可以保留分數最大的或者其他的
select min(rowid) from ( a_h_mid ) group by stIdCard,stYear,semester having count(*) > 1
四、刪掉重復的保留最小rowid的記錄
delete from a_h_mid b where b.stu_id in (select a.stu_id from (select stName, stu_id,rowid, stIdCard,stYear,semester from a_h_mid where (stIdCard,stYear,semester) in (select stIdCard,stYear,semester from a_h_mid group by stIdCard,stYear,semester having count(*) > 1) and rowid not in (select min(rowid) from ( a_h_mid ) group by stIdCard,stYear,semester having count(*) > 1) ) a )