开窗函数在MySQL8与AWS Redshift中的不同

我们是某电商平台类企业,公司会在我们平台根据需求注册若干个供应商账号(Vendor Code)。最近获取到了一个业务部门的需求,是根据供应商公司在平台的若干个账号中,选取GMS最大的一个进行发送邮件的task。 

本来感觉挺简单的,根据公司进行开窗函数,取编号为1的Vendor。可是业务部门根据SQL结果发信后发现,有些明显的GMS很大的供应商没发到邮件,中间过程检查了很多,最后定位在了最后的排序那里。

原来AWS Redshift和常用的MySQL在开窗函数上是有不同的,这里我简单举了一个例子供大家引以为鉴

SQL脚本(不用做任何调整,Redshift和MySQL均支持这条简单的查询语句):

with tmp as (
select 'a' as com, 100 as money
union all
select 'a' as com, 200 as money
union all
select 'a' as com, 300 as money
union all
select 'a' as com, null as money
)
select com, money, row_number() over(partition by com order by money desc) as rk from tmp

结果展示:

1、MySQL:

2、Redshift: 

 结果分析:

 

从上面的截图可以看到,在开窗操作(row_number())时,MySQL将null值往后面放;然而Redshift是将null值往前放的,要得出有意义的排序,就需要将Redshift为null的值手动匹配成0,然后参与排序,这样才是我们要的操作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值