row_number() over (partition by * order by *) 排序失效

问题描述:

执行sql

select v1.*, row_number() over (partition by v1.em_code, v1.cldate order by v1.rn) as rn2 from v1

结果

codestatuscreate_daternrn2
hzdz-scsb01412020/5/9 8:30:0021
hzdz-scsb01432020/5/9 8:46:0611
hzdz-scsb01412020/5/9 8:46:2711
hzdz-scsb01412020/5/9 8:55:4011
hzdz-scsb01432020/5/9 8:55:4012
hzdz-scsb014 2020/5/9 9:00:0021

 

 

 

 

 

 

 

 

执行sql

 select * from (select v1.*, row_number() over (partition by v1.em_code, v1.cldate order by v1.rn) as rn2 from v1) t where t.rn2 = 1

预期结果应该是过滤掉create_date为2020/5/9 8:55:40,status为3这行数据

结果

codestatuscreate_daternrn2
hzdz-scsb01412020/5/9 8:30:0021
hzdz-scsb01432020/5/9 8:46:0611
hzdz-scsb01412020/5/9 8:46:2711
hzdz-scsb01432020/5/9 8:55:4011
hzdz-scsb01432020/5/9 9:00:0012

 

 

 

 

 

 

 

结果与预期不符

原因:

1、使用 row_number() over (partition by v1.em_code, v1.cldate order by v1.rn), 进行数据分析时, order by的字段最好是唯一的,不为空的,如果重复或为空,排序可能会失败,按照sql的默认排序去取值。

2、ORACLE默认排序规则

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值