如何在Snowflake SQL中为销售数据分配稳定的唯一排名
我之前也踩过这个坑!你遇到的问题其实是row_number()函数的一个常见“小陷阱”:当你用来排序的字段(比如sum(net_sales_gbp))出现相同值时,Snowflake没有明确的规则来决定这些并列行的顺序——它会根据查询执行时的内部细节(比如数据的物理存储顺序、查询中选择的字段)随机分配排名,这就是为什么你不同查询得到的排名会互换。
要解决这个问题,关键是给order by子句加上一个稳定且唯一的字段,用来打破并列时的随机排序。这样,即使销售数据相同,数据库也会根据这个固定字段来确定顺序,保证每次查询的排名都一致。
具体修改方案
你只需要在现有的row_number()窗口函数的order by部分,追加一个能唯一标识产品的固定字段(比如产品ID、产品名称,只要这个字段的值是固定不变的就行)。
比如修改你的net_sales_gbp_daily_channel_rank计算:
row_number() over ( partition by o.order_date, o.business_reporting_channel order by sum(o.net_sales_gbp) desc, o.product_name -- 追加产品名作为稳定排序依据 ) as net_sales_gbp_daily_channel_rank
同样的,sales_quantity_daily_channel_rank也要做对应的修改:
row_number() over ( partition by o.order_date, o.business_reporting_channel order by sum(o.sales_quantity) desc, o.product_name ) as sales_quantity_daily_channel_rank
为什么这能解决问题?
以你例子里的Rsbry和Grn产品为例:当它们的net_sales_gbp总和相同时,Snowflake会按照product_name的字母顺序来排序(或者你用产品ID的话,就是ID的固定顺序)。不管你查询全量字段还是只查特定列,这个排序逻辑都是固定的,所以row_number()分配的排名就不会再随机变化了。
小提醒
如果你的产品名称可能存在重复(比如不同产品线有同名产品),那最好用更可靠的唯一标识,比如product_id——毕竟ID是专门用来唯一区分每条记录的,稳定性更强。
内容来源于stack exchange

