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

相关文章: