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)函数筛选出了去重后的结果。

猜你喜欢

转载自blog.csdn.net/wbj3106/article/details/82109077
今日推荐