sql刪除重復數據,保留一條


原文參考: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 ) 

 


免責聲明!

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



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