每日10行代码69:oracle查询从多条数据中取一条最新的(最大的,最多的,最小的,最早的),也可用于删除重复数据
因为各种原因,一般的业务系统中会保存多条明细数据,但在实际使用中时,可能只需要使用其中的一条数据。比如上面的这个数据(表名为jobs),假如我想取某个人最新一条有效的工作单位信息,每个人只保留一条数据,也就是:普通写sql的话,一般是先查出有效标志为Y的最大的更新日期,然后再做一次关联查询。with b as(select 姓名,max(更新日期) max_rq from jobs where 有
·
因为各种原因,一般的业务系统中会保存多条明细数据,但在实际使用中时,可能只需要使用其中的一条数据。

比如上面的这个数据(表名为jobs),假如我想取某个人最新一条有效的工作单位信息,每个人只保留一条数据,也就是:
普通写sql的话,一般是先查出有效标志为Y的最大的更新日期,然后再做一次关联查询。
with b as(
select 姓名,max(更新日期) max_rq from jobs where 有效标志='Y' group by 姓名)
select * from jobs,b where jobs.姓名=b.姓名 and jobs.更新日期=b.max_rq
这种做法初看没有问题,但是如果数据按更新日期来看还是有重复的呢,比如:
上面的张三11月17号有两条数据,如果按上面的sql来取值的话,还是会取出张三的两条数据,但是每个人的数据我只想要一条,需要怎么办呢?更好的办法是用row_number() 函数。
select * from (
select
姓名,更新日期,工作单位,有效标志,row_number() over(partition by 姓名 order by 更新日期 desc) rn from jobs where 有效标志='Y'
)
where rn=1
这种方法还有一个好处就是partition by和order by都可以对多字段进行分组或排序,从而实现更复杂的的一些过滤。例如:
如果想在上面的条件上再查有效期起最早的一条,那么可以这样写
select * from (
select
姓名,更新日期,工作单位,有效标志,row_number() over(partition by 姓名 order by 更新日期 desc,有效期起 asc) rn from jobs where 有效标志='Y'
)
where rn=1
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)