You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 23:45:03