SQL根據某列或幾列去重,row_number() over(partition by)的用法

未經許可,請勿轉載,謝謝合作。
若本文對您有一點點的幫助,歡迎點贊、評論和關注。您的鼓勵和支持是我繼續學習和分享的動力。
推薦免費、高效、入門級的SQL教程http://www.w3school.com.cn/sql/index.asp
有時利用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

這裏寫圖片描述
圖1
我們看到,在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即爲所需結果

這裏寫圖片描述
圖2
此時,即主要利用了row_number() over(partition by)函數篩選出了去重後的結果。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章