Snowflake中基于现有列动态生成Allocation计算列的实现咨询
Snowflake中基于现有列动态生成Allocation计算列的实现咨询
嘿,我来帮你搞定Snowflake里这个Allocation列的计算问题!先理清楚你的需求:你希望Allocation列的值为1,直到Proj列出现负值(包括首次出现负值的行),之后默认值为0?不过看你给出的示例数据,即使Proj已经出现负值,后面的行Allocation还是1,这可能说明你实际需求是只要Proj没有持续处于负值状态,Allocation就保持1?我先给你两种常见场景的实现方案,你可以根据实际需求调整:
场景1:直到首次出现负值的行都为1,之后所有行固定为0
如果你的规则是「从第一行开始,到第一次出现Proj < 0的行为止,所有行Allocation为1,之后不管Proj是什么值都为0」,可以用窗口函数结合条件判断实现:
SELECT Supply, Demand, Week_Start_Date, Proj, CASE -- 计算当前行之前是否已经出现过负值 WHEN SUM(CASE WHEN Proj < 0 THEN 1 ELSE 0 END) OVER (ORDER BY Week_Start_Date ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) = 0 THEN 1 ELSE 0 END AS Allocation FROM your_table_name ORDER BY Week_Start_Date;
这里依赖Week_Start_Date的排序,确保按时间顺序处理数据,首次出现负值的行会保留为1,后续所有行自动变为0。
场景2:只要Proj非负就为1,出现负值时仍保持1(匹配你的示例)
如果你的规则是「无论Proj是否为负,Allocation始终为1」,那逻辑就更简单:
SELECT Supply, Demand, Week_Start_Date, Proj, 1 AS Allocation FROM your_table_name ORDER BY Week_Start_Date;
不过猜你大概率不是这个需求,如果是Proj出现负值后,后续若Proj恢复非负则再次变为1,也可以用窗口函数标记连续分组来实现:
WITH grouped_data AS ( SELECT Supply, Demand, Week_Start_Date, Proj, -- 标记每个连续非负/负值的分组 SUM(CASE WHEN Proj >= 0 THEN 0 ELSE 1 END) OVER (ORDER BY Week_Start_Date) AS group_id FROM your_table_name ) SELECT Supply, Demand, Week_Start_Date, Proj, -- 非负行直接为1,负值行如果所在分组之后有非负行也为1(可根据需求调整) CASE WHEN Proj >= 0 THEN 1 ELSE 1 END AS Allocation FROM grouped_data ORDER BY Week_Start_Date;
如果你的实际规则和上面的场景都不匹配,可以补充更详细的逻辑说明,我再帮你调整SQL~
备注:内容来源于stack exchange,提问作者Aman Maurya
相关产品推荐
相关产品推荐

