oracle 中的ROW_NUMBER() OVER() 的用法以及如何把空值转化指定值——记一次查询

本文介绍了在Oracle中如何使用ROW_NUMBER() OVER() 分析函数来处理重复数据,以及如何将空值转换为指定值。在解决数据筛选问题时,通过ORDER BY结合ROW_NUMBER()函数,解决了不能单纯依赖MAX()函数的情况。同时,文章讨论了Oracle中类似SQL Server的TOP功能实现,并提供了NVL函数在处理空值时的应用。
摘要由CSDN通过智能技术生成

前提条件与需求

主表: ag_ba_old_base
从表: AG_BA_OLD_MEDICAL
字典表: jz_dictionary

在从表中有ag_ba_old_base_id 这个字段是和主表关联的,但是由于各种各样的原因导致从表中有很多重复数据,我们需要从中筛选出同样ag_ba_old_base_id 中 最新的更新日期 ,如果没有更新日期那么用id来比较,id比较大的优先留着。

如下图

select t.ag_ba_old_base_id ,count(id) from AG_BA_OLD_MEDICAL t where t.create_date is not null  
group by t.ag_ba_old_base_id 
having count(id) >3

实际上重复两次和三次的也很多 这里只是为了演示一下重复数据

这里写图片描述

我们找一个重复次数比较多的数据来看

select t.id,t.ag_ba_old_base_id,t.create_date
from AG_BA_OLD_MEDICAL t 
where ag_ba_old_base_id = 81904287
order by t.ag_ba_old_base_id,t.create_date desc,t.id desc

这里写图片描述

这里我们可以看到重复数据之间的区别是 create_date 和此表类似于主键的id(之所以这么说是因为此表非常不规范 不能按照主键处理),而且接到任务时被告知这表中可能存在id小但是create 但是create_date 更新的情况。所以在筛选时不能单单利用max()函数来直接分组查询,这给这次查询增加了一点难度。但是

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值