Oracle SQL如何获取单条最新日期的分类数据?
解决Oracle SQL获取最新category数据的问题
你的问题出在窗口函数的分区条件里包含了category,导致每个category单独计算了自身的最大日期,所以两行结果都被保留。要拿到contract、part_no、niin分组下最新日期对应的category,可以用以下两种简单方法:
方法一:使用ROW_NUMBER()窗口函数
这是最直接的方式,通过窗口函数给每个分组内的行按日期倒序编号,取编号为1的行就是最新数据:
SELECT contract, part_no, niin, category, date_entered AS most_recent_date FROM ( SELECT contract, part_no, niin, category, date_entered, -- 仅按contract、part_no、niin分区,按日期降序排序 ROW_NUMBER() OVER(PARTITION BY contract, part_no, niin ORDER BY date_entered DESC) rn FROM (**inner query**) -- 替换成你的内部查询 ) WHERE rn = 1;
方法二:先获取分组最大日期再关联
先通过子查询拿到每个分组的最新日期,再和原数据关联匹配对应的category:
WITH max_dates AS ( SELECT contract, part_no, niin, MAX(date_entered) AS most_recent_date FROM (**inner query**) -- 替换成你的内部查询 GROUP BY contract, part_no, niin ) SELECT md.contract, md.part_no, md.niin, t.category, md.most_recent_date FROM max_dates md JOIN (**inner query**) t ON md.contract = t.contract AND md.part_no = t.part_no AND md.niin = t.niin AND md.most_recent_date = t.date_entered;
为什么原来的查询不行?
你原来的PARTITION BY包含了category,相当于把contract+part_no+niin+category作为分组单位,每个category都会算出自己的最大日期,所以两行结果都被保留。而我们需要的是contract+part_no+niin这一组的全局最新日期,所以分区条件里不能加category。
内容的提问来源于stack exchange,提问作者KassieB
相关产品推荐
相关产品推荐

