Oracle row_number() over partition by 空值导致结果不对

探讨在SQL中使用row_number() over partition by时遇到的意外结果问题,特别是当orderby字段存在空值时如何调整SQL以获取正确数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在使用row_number() over partition by过程中,发现取得值与预期的结果不符

话不多说,SQL如下

select *
  from (select faccountnum,
               faccountcode,
               faccounttype,
               forgancode,
               row_number() over(partition by faccountcode order by fchecktime desc) as rn
          from qsaccount b
         where fcheckstate = '1'
           and faccounttype in ('12', '3', 'dzzh', '16')
           and faccountcode in ('9040510012269017')) t

row_number() over partition by 的作用就无需赘述了,我只大概讲一下我的业务需求。
由于有些账户他有多个机构,我只取一个,在账户表中按照账号进行分组,然后按照审核时间进行排序,取最新的一条记录
效果如下图所示:
在这里插入图片描述
我们发现,现在的结果是预期的们只需要我们选择rn=1的就是我们想要的结果
然而当我增加上了where rn=1的时候却发生了意想不到的结果,如下图所示:
在这里插入图片描述
他取到的结果却是和我们预期相反。
这个SQL翻来覆去就这么多,想了半天也没想出个结果来。
后来却是发现了了原因:
原来在over partition by order by的时候,我order by的字段fchecktime 他在原表中是一个空(null)值,导致我最终的结果有误,后来,多增加了一个order by 条件,上述问题就解决了
在这里插入图片描述
这个问题看SQL是看不出来的,SQL没问题的情况下就是数据有问题了。Mark一下。
如有问题,请随时联系沟通。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值