SQL去重的3種實(shí)用方法總結(jié)
SQL去重的三種方法匯總?

這里的去重是指:查詢的時(shí)候, 不顯示重復(fù),并不是刪除表中的重復(fù)項(xiàng)
1.distinct去重
注意的點(diǎn):distinct
只能一列去重,當(dāng)distinct后跟大于1個(gè)參數(shù)時(shí),他們之間的關(guān)系是&&(邏輯與)關(guān)系,只有全部條件相同才會去重
弊端:當(dāng)查詢的字段比較多時(shí),distinct會作用多個(gè)字段,導(dǎo)致去重條件增多
select distinct UserResult from Table1

2.group by去重
去重原理:將重復(fù)的行進(jìn)行分組,相同的數(shù)據(jù)只顯示第一行
弊端:使用group by后,所有查詢字段都需要使用聚合函數(shù),比較繁瑣
select min(UserName)UserName,min(UserSex)UserSex,min(UserSubject)UserSubject,min(UserResult)UserResult from Table1 group by UserResult

3.row_number() over (parttion by 分組列 order by 排序列)
弊端:小孟還不知道
去重原理:現(xiàn)根據(jù)重復(fù)列進(jìn)行分組,分組后再進(jìn)行排序,不同的組序號為1,相同的組序號為2,排除為2的就達(dá)到了去重效果
select *from ( --查詢出重復(fù)行 select *,row_number() over (partition by UserResult order by UserResult desc)num from Table1 )A where A.num=1

這里安利第三個(gè),row_number(),穩(wěn)一些!
補(bǔ)充:SQL根據(jù)某列或幾列分組去重——row_number() over(partition by)的用法
有時(shí)利用SQL進(jìn)行數(shù)據(jù)處理會發(fā)現(xiàn),要根據(jù)某列或某幾列選取信息,由于其他列不同而出現(xiàn)了多次,如運(yùn)行程序1的結(jié)果圖1:
程序1:
--程序1:要解決的問題
select a.*
from AShareEarningEst a
where a.S_INFO_WINDCODE in ('000650.SZ')
and a.REPORTING_PERIOD = 20181231
order by a.RESEARCH_INST_NAME,a.EST_DT
我們看到,在AShareEarningEst(中國A股盈利預(yù)測明細(xì))表中,共有12人次的證券公司研究員,對000650.SZ(仁和藥業(yè))公司的20181231報(bào)告期進(jìn)行預(yù)測。例:華泰證券的楊燁輝在20160420、20160428和20160622分別對000650.SZ(仁和藥業(yè))發(fā)布研究報(bào)告進(jìn)行了預(yù)測?,F(xiàn)在,我們只需要同一家證券公司的同一個(gè)研究員(此處假定同一家證券公司的研究員姓名相同時(shí),即為同一個(gè)研究員)做出的最新預(yù)測數(shù)據(jù),即根據(jù)證券公司名稱、研究員姓名,同時(shí)根據(jù)估計(jì)日期進(jìn)行篩選。
此時(shí),可根據(jù)row_number() over(partition by)進(jìn)行處理,運(yùn)行程序2結(jié)果如圖2:
程序2:
--程序2:最終解決問題的程序
select b.*
from (select row_number() over(partition by a.RESEARCH_INST_NAME,
a.ANALYST_NAME order by est_dt desc) as rn,
--根據(jù)RESEARCH_INST_NAME(證券公司名稱)和ANALYST_NAME(研究員名字)進(jìn)行分類,
--同時(shí)根據(jù)est_dt(估計(jì)日期)倒序排序,即最新日期排在同一分類的上方,此時(shí)構(gòu)建出rn為
a.*
from wdzx.AShareEarningEst a
where a.S_INFO_WINDCODE in ('000650.SZ') --, '000951.SZ', '600006.SH', '600166.SH')
and a.REPORTING_PERIOD = 20181231) b --將分類后的程序構(gòu)成表b。可以先運(yùn)行b的程序觀察結(jié)果
where b.rn = 1--運(yùn)用表b的結(jié)果進(jìn)行子查詢,rn=1即為所需結(jié)果
此時(shí),即主要利用了row_number() over(partition by)函數(shù)篩選出了去重后的結(jié)果。
總結(jié)
到此這篇關(guān)于SQL去重的3種實(shí)用方法的文章就介紹到這了,更多相關(guān)SQL去重內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Mysql數(shù)據(jù)庫雙機(jī)熱備難點(diǎn)分析
本文主要給大家介紹了在Mysql數(shù)據(jù)庫雙機(jī)熱備其中的難點(diǎn)分析以及重要環(huán)節(jié)的經(jīng)驗(yàn)心得,需要的朋友收藏分享下吧。2017-12-12
淺談MySQL存儲引擎選擇 InnoDB與MyISAM的優(yōu)缺點(diǎn)分析
MyISAM 是MySQL中默認(rèn)的存儲引擎,一般來說不是有太多人關(guān)心這個(gè)東西。決定使用什么樣的存儲引擎是一個(gè)很tricky的事情,但是還是值我們?nèi)パ芯恳幌?,這里的文章只考慮 MyISAM 和InnoDB這兩個(gè),因?yàn)檫@兩個(gè)是最常見的2013-06-06
DQL命令查詢數(shù)據(jù)實(shí)現(xiàn)方法詳解
DQL(Data?Query?Language,數(shù)據(jù)查詢語言),查詢數(shù)據(jù)庫數(shù)據(jù),如SELECT語句,簡單的單表查詢或多表的復(fù)雜查詢和嵌套查詢,數(shù)據(jù)庫語言中最核心、最重要的語句,使用頻率最高的語句2022-09-09
MySql按時(shí),天,周,月進(jìn)行數(shù)據(jù)統(tǒng)計(jì)
這篇文章主要介紹了MySql按時(shí),天,周,月進(jìn)行數(shù)據(jù)統(tǒng)計(jì),文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-08-08
MySQL關(guān)于sql_mode解析與設(shè)置講解
今天小編就為大家分享一篇關(guān)于MySQL關(guān)于sql_mode解析與設(shè)置講解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-03-03
mysql數(shù)據(jù)庫中g(shù)etshell的方式總結(jié)
MySQL版本大于5.0,MySQL 5.0版本以上會創(chuàng)建日志文件,我們通過修改日志文件的全局變量,就可以GetSHELL,下面這篇文章主要給大家介紹了關(guān)于mysql數(shù)據(jù)庫中g(shù)etshell的方式,需要的朋友可以參考下2022-07-07

