Snowflake中SQL DENSE_RANK()未达预期,求解决方案及替代方法
问题分析与解决方案
你的核心问题是:当前的DENSE_RANK()在PARTITION BY sku, rolling_inbound后按week排序,会给同一(sku, rolling_inbound)组内的每行单独递增排名,而你需要的是同一组内所有行共享同一个排名,且不同组按时间顺序依次编号。
解决方案1:基于组的最小周数生成排名
通过嵌套窗口函数,先计算每个(sku, rolling_inbound)组的最早周数,再以此为依据在sku分区内生成排名:
SELECT week, sku, units_sold, inbound, rolling_inbound, DENSE_RANK() OVER(PARTITION BY sku ORDER BY MIN(week) OVER(PARTITION BY sku, rolling_inbound)) AS sku_rank FROM table
这个方法完全依赖时间顺序确定组的排名,不受rolling_inbound数值大小影响,适配所有场景。
解决方案2:先分组计算排名再关联原表
用CTE先给每个(sku, rolling_inbound)组分配排名,再关联回原表,逻辑更直观:
WITH group_ranks AS ( SELECT sku, rolling_inbound, DENSE_RANK() OVER(PARTITION BY sku ORDER BY MIN(week)) AS sku_rank FROM table GROUP BY sku, rolling_inbound ) SELECT t.week, t.sku, t.units_sold, t.inbound, t.rolling_inbound, gr.sku_rank FROM table t JOIN group_ranks gr ON t.sku = gr.sku AND t.rolling_inbound = gr.rolling_inbound ORDER BY t.week
结果验证
以上两种方案都会生成你期望的结果:同一sku下,相同rolling_inbound的所有行共用一个排名,且排名按组的出现时间依次递增。
内容的提问来源于stack exchange,提问作者FI_2018
相关产品推荐
相关产品推荐

