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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.17 10:14:34