sql技巧(二)去除重復記錄

導讀:在數據庫的處理工作,會遇到重復記錄的問題,會影響數據的分析結果的準確性,今天我們探討一下在數據庫中對重復記錄的操作;

示例數據如下我們可以看到一個name有兩條記錄,有的是英語成績不一樣(zhangsan),有的是math成績不一樣(wangwu),有的是兩個都不一樣(zhaoliu),有的是記錄完全一致(lisi),針對不同的記錄重復情況有不同的處理辦法。(原則為保留該科目最高成績?yōu)樽罱K成績,即刪除成績較低的行,記錄相同保留最近一條記錄,number更大的,記錄都不相同則取數學成績高的記錄)


示例數據 ? ? ?


示例結果

首先要找出重復的記錄

? ? SELECT name? FROM? repeat_nums? GROUP BY? name? HAVING COUNT(1) >1


有重復成績的學生

1.處理兩條記錄完全一致的情況

①找出要刪除的行

SELECT? * FROM? repeat_nums

WHERE? name in (SELECT name? FROM? repeat_nums? GROUP BY? name ,math,english HAVING COUNT(1) >1)

AND? ? number in (SELECT min(number)? FROM? repeat_nums? GROUP BY? name? HAVING COUNT(1) >1)

② 刪除 ? ?把 select 改為delete?

2.處理有一個字段重復的情況

SELECT? * FROM? repeat_nums

WHERE? CAST(name as VARCHAR ) + CAST(math as VARCHAR)+ CAST(english as VARCHAR)

in (SELECT CAST(name as VARCHAR ) +CAST(min(math) as VARCHAR)+ CAST(min (english) as VARCHAR)? FROM? repeat_nums? GROUP BY? name? HAVING COUNT(1) >1)

①找出要刪除的行

② 刪除? ? 把 select 改為delete

3.處理兩個字段都不一致的情況(選擇數學成績好的記錄)

①找出要刪除的行(name)

SELECT? name? FROM? repeat_nums? as? a

WHERE? CAST(math as VARCHAR)+ CAST(english as VARCHAR)? not in

(SELECT? CAST(min(math) as VARCHAR)+ CAST(min(english) as VARCHAR)? FROM? repeat_nums? GROUP BY? name? HAVING COUNT(1) >1)

and

CAST(math as VARCHAR)+ CAST(english as VARCHAR)? not in

(SELECT CAST(max(math) as VARCHAR)+ CAST(max(english) as VARCHAR)? FROM? repeat_nums? GROUP BY? name? HAVING COUNT(1) >1)

and

name in (SELECT name? FROM? repeat_nums? GROUP BY? name? HAVING COUNT(1) >1)

② 刪除

DELETE ?FROM? repeat_nums? as a? WHERE name in

(SELECT? name? FROM? repeat_nums? as? a

WHERE? CAST(math as VARCHAR)+ CAST(english as VARCHAR)? not in

(SELECT? CAST(min(math) as VARCHAR)+ CAST(min(english) as VARCHAR)? FROM? repeat_nums? GROUP BY? name? HAVING COUNT(1) >1)

and

CAST(math as VARCHAR)+ CAST(english as VARCHAR)? not in

(SELECT CAST(max(math) as VARCHAR)+ CAST(max(english) as VARCHAR)? FROM? repeat_nums? GROUP BY? name? HAVING COUNT(1) >1)

and

name in (SELECT name? FROM? repeat_nums? GROUP BY? name? HAVING COUNT(1) >1))

AND? MATh? in (SELECT min(MATH) FROM? repeat_nums? GROUP BY? name? HAVING COUNT(1) >1)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容