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

在SAS环境中实现两张Snowflake表的循环计算需求

SAS 实现方案

核心逻辑

按Category分组,从表A的初始记录开始,利用RETAIN语句保留上期期末金额,迭代计算后续月份的期初、期末值。

代码示例

/* 从Snowflake拉取并合并初始数据与净额数据 */
proc sql;
    connect to snowflake (server='你的服务器地址' database='库名' schema='模式名' warehouse='仓库名' role='角色名' user='用户名' password='密码');
    create table combined_data as
        select Category, Month, Beginning_Dollar_AMT, End_Dollar_AMT, . as Net_Dollar_balance
        from connection to snowflake (select * from 表A)
        union all
        select Category, Month, . as Beginning_Dollar_AMT, . as End_Dollar_AMT, Net_Dollar_balance
        from connection to snowflake (select * from 表B);
    disconnect from snowflake;
quit;

/* 按类别和月份排序,保证迭代顺序 */
proc sort data=combined_data;
    by Category Month;
run;

/* 迭代计算期初、期末金额 */
data table_c;
    set combined_data;
    by Category;
    retain curr_end;
    
    if first.Category then do;
        /* 初始化:取表A的初始期末值 */
        curr_end = End_Dollar_AMT;
        /* 输出初始记录 */
        if not missing(Beginning_Dollar_AMT) then do;
            Beginning_balance_amt = Beginning_Dollar_AMT;
            output;
        end;
    end;
    
    /* 处理后续月份的净额数据 */
    if missing(Beginning_Dollar_AMT) then do;
        Beginning_balance_amt = curr_end;
        End_Dollar_AMT = min(Beginning_balance_amt, Net_Dollar_balance);
        curr_end = End_Dollar_AMT;
        output;
    end;
    
    keep Category Month Beginning_balance_amt End_Dollar_AMT;
run;
Snowflake 实现方案

核心逻辑

用递归CTE按Category分组,从表A的初始记录出发,逐行关联表B的后续净额数据,迭代计算每期的期初、期末值。

代码示例

WITH initial_records AS (
    -- 提取表A的初始数据
    SELECT 
        Category,
        Month,
        Beginning_Dollar_AMT AS Beginning_balance_amt,
        End_Dollar_AMT
    FROM 表A
),
sorted_net_data AS (
    -- 给表B的净额数据按类别和月份排序,生成迭代序号
    SELECT 
        Category,
        Month,
        Net_Dollar_balance,
        ROW_NUMBER() OVER (PARTITION BY Category ORDER BY Month) AS iter_seq
    FROM 表B
),
recursive_calculation AS (
    -- 递归起始:初始记录
    SELECT 
        Category,
        Month,
        Beginning_balance_amt,
        End_Dollar_AMT,
        0 AS iter_seq
    FROM initial_records
    
    UNION ALL
    
    -- 递归迭代:关联下一期净额数据,计算当期值
    SELECT 
        snd.Category,
        snd.Month,
        rc.End_Dollar_AMT AS Beginning_balance_amt,
        MIN(rc.End_Dollar_AMT, snd.Net_Dollar_balance) AS End_Dollar_AMT,
        snd.iter_seq
    FROM recursive_calculation rc
    JOIN sorted_net_data snd 
        ON rc.Category = snd.Category 
        AND snd.iter_seq = rc.iter_seq + 1
)
-- 生成最终表C
SELECT 
    Category,
    Month,
    Beginning_balance_amt,
    End_Dollar_AMT
INTO 表C
FROM recursive_calculation
ORDER BY Category, Month;

内容的提问来源于stack exchange,提问作者Yumeng Xu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 09:52:52