Snowflake中DENSE_RANK排名从2而非1起始的解决方法问询
问题根因
你遇到的排名从2开始的核心原因是:SQL 引擎默认在apercent desc降序排序时,会将 NULL 值排在所有非 NULL 值的最前面。dense_rank() 计算排名时会把 NULL 行算作第1名,你外层的 CASE 只是最终将 NULL 行对应的排名置为 NULL,并没有改变排名计算阶段的排序逻辑,所以非 NULL 值的排名就从2开始了。
解决方案
直接在窗口函数的排序规则中指定 NULL 值排在最后即可,修改后的语句如下:
CASE WHEN apercent IS NULL THEN NULL ELSE dense_rank() over (partition by adate order by apercent desc NULLS LAST) END as arank
如果你使用的 SQL 引擎不支持 NULLS LAST 语法(比如部分低版本 MySQL),可以用条件排序实现相同效果:
CASE WHEN apercent IS NULL THEN NULL ELSE dense_rank() over (partition by adate order by case when apercent is null then 1 else 0 end, apercent desc) END as arank
修改后非 NULL 的 apercent 会按照降序排在最前面,最大值对应的排名为1,NULL 行排在最后且最终返回的 arank 为 NULL,完全匹配你的预期结果。
内容的提问来源于stack exchange,提问作者tennis_fan89
相关产品推荐
相关产品推荐

