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

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

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


示例數(shù)據(jù) ? ? ?


示例結果

首先要找出重復的記錄

? ? 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.處理兩個字段都不一致的情況(選擇數(shù)學成績好的記錄)

①找出要刪除的行(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)

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容

  • 2017/3/14 RDBMS:關系型數(shù)據(jù)庫管理系統(tǒng) 關系模型獨立于語言 SQL有幾種不同類型的語言:數(shù)據(jù)定義語言...
    ancherl閱讀 1,658評論 0 6
  • 背景 一年多以前我在知乎上答了有關LeetCode的問題, 分享了一些自己做題目的經(jīng)驗。 張土汪:刷leetcod...
    土汪閱讀 12,771評論 0 33
  • 什么是SQL數(shù)據(jù)庫: SQL是Structured Query Language(結構化查詢語言)的縮寫。SQL是...
    西貝巴巴閱讀 1,855評論 0 10
  • 一.數(shù)據(jù)庫 1.創(chuàng)建數(shù)據(jù)庫create database [if not exists] db_name [cha...
    PASSssss閱讀 508評論 0 0
  • 你打算把自己賣多少錢 文/不要先生 春水初生,春林初盛,春風十里,不如把自己賣個好價錢! 對于即將畢業(yè)的同學們,相...
    不要先生閱讀 320評論 0 0