首頁 > 軟體

SQL去重的3種實用方法總結

2022-10-28 14:06:35

SQL去重的三種方法彙總​ 

這裡的去重是指:查詢的時候, 不顯示重複,並不是刪除表中的重複項

1.distinct去重

注意的點:distinct

只能一列去重,當distinct後跟大於1個引數時,他們之間的關係是&&(邏輯與)關係,只有全部條件相同才會去重

弊端:當查詢的欄位比較多時,distinct會作用多個欄位,導致去重條件增多

select distinct UserResult from Table1

2.group by去重

去重原理:將重複的行進行分組,相同的資料只顯示第一行

弊端:使用group by後,所有查詢欄位都需要使用聚合函數,比較繁瑣

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 排序列)

弊端:小孟還不知道

去重原理:現根據重複列進行分組,分組後再進行排序,不同的組序號為1,相同的組序號為2,排除為2的就達到了去重效果

select *from
(
--查詢出重複行
select *,row_number() over (partition by UserResult order by UserResult desc)num from Table1
)A
where A.num=1

這裡安利第三個,row_number(),穩一些!

補充:SQL根據某列或幾列分組去重——row_number() over(partition by)的用法

有時利用SQL進行資料處理會發現,要根據某列或某幾列選取資訊,由於其他列不同而出現了多次,如執行程式1的結果圖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股盈利預測明細)表中,共有12人次的證券公司研究員,對000650.SZ(仁和藥業)公司的20181231報告期進行預測。例:華泰證券的楊燁輝在20160420、20160428和20160622分別對000650.SZ(仁和藥業)釋出研究報告進行了預測。現在,我們只需要同一家證券公司的同一個研究員(此處假定同一家證券公司的研究員姓名相同時,即為同一個研究員)做出的最新預測資料,即根據證券公司名稱、研究員姓名,同時根據估計日期進行篩選。

此時,可根據row_number() over(partition by)進行處理,執行程式2結果如圖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,
             --根據RESEARCH_INST_NAME(證券公司名稱)和ANALYST_NAME(研究員名字)進行分類,
             --同時根據est_dt(估計日期)倒序排序,即最新日期排在同一分類的上方,此時構建出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 --將分類後的程式構成表b。可以先執行b的程式觀察結果
       where b.rn = 1--運用表b的結果進行子查詢,rn=1即為所需結果

此時,即主要利用了row_number() over(partition by)函數篩選出了去重後的結果。

總結

到此這篇關於SQL去重的3種實用方法的文章就介紹到這了,更多相關SQL去重內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com