【问题标题】:SAS subtracting the most recent results from the previous onesSAS 从以前的结果中减去最近的结果
【发布时间】:2021-12-17 06:38:00
【问题描述】:

我想修改函数代码以减去结果,例如今天的 Run_date 来自上一个。但是,我的观点是它应该只从相同的 POLICY_VIntage 中减去结果,即当前 (rund_date) 2021.01 - 先前 (2021.01)。不像下面的图片,例如 2021.08 - 2021.09 [![在此处输入图片描述][1]][1]

我想要一些这样的

  [1]: https://i.stack.imgur.com/T7k8Y.png


proc sql;   
create table policy_vintage_weekly as
  select 
    policy_vintage
    ,count(NRB) as number_policy
    ,today() as Run_Date format weeku.
  from PolisyEnd
  where POLIS= "W"
  group by policy_vintage
;
quit;

data policy_vintage_weekly_all;
set
  _work.policy_vintage_weekly (where=(run_date ne today()))
  policy_vintage_weekly
;
by policy_vintage run_date;
run;

%if &syscc. = 0
%then %do;


data _work.policy_vintage_weekly;
set policy_vintage_weekly_all;
by policy_vintage;
diff_value = dif(number_policy);
if not last.policy_vintage then diff_value = .;
run;
%end;
/* print report */
proc print data=_work.policy_vintage_weekly noobs;
var policy_vintage number_policy run_date diff_value;
run;

【问题讨论】:

    标签: sql sas


    【解决方案1】:

    使用 SQL 将当天的数据和前一天的最新数据按政策年份进行连接,然后将这两个值相减。

    示例数据:

    data have;
        input run_date:date9. policy_vintage$ total;
        format run_date date9.;
    
        datalines;
    02NOV2021 A 100
    02NOV2021 B 200
    02NOV2021 C 300
    ;
    run;
    
    data history;
        input run_date:date9. policy_vintage$ total;
        format run_date date9.;
    
        datalines;
    01NOV2021 A 10
    01NOV2021 B 20
    01NOV2021 C 30
    02NOV2021 A 100
    02NOV2021 B 200
    02NOV2021 C 300
    ;
    run;
    

    解决方案:

    proc sql noprint;
        create table want as
            select today.policy_vintage
                 , today.total as total_today
                 , prior.total as total_prior
                 , today.total - prior.total as diff
            from have as today
            LEFT JOIN
                 (select *
                  from history
                  where run_date < today()
                  having run_date = max(run_date)
                 ) as prior
            ON today.policy_vintage = prior.policy_vintage
       ;
    quit;
    

    输出:

    policy_vintage  total_today total_yesterday diff
    A               100         10              90
    B               200         20              180
    C               300         30              270
    

    【讨论】:

    • 感谢您的回复。这里的问题是我不知道之前的数据是什么,因为我每周运行这段代码,结果附加到主 _work.policy_vintage_weekly 文件中。我想减去每个 policy_vintage 的结果让我们说今天 () - 最后一个 run_date 记录
    • 我更新了代码以始终提取当天之前的最新值。
    • 如果我有 Policy Vintage,那就是日期。它在示例中的代码中很重要,例如您对 b c e.g?
    • 没关系。就 SAS 而言,它是一个连接键。无论您是按日期加入还是按字符加入,加入逻辑都是一样的。
    • 非常感谢你明天的工作森林,但现在我可以看到它应该工作。如果我想将数据集今天 () 添加到历史数据集,则在运行您的代码示例后还有一个问题。那么这段代码就ok了:data _work.policy_vintage_weekly; set _work.policy_vintage_weekly (where=(run_date ne today())) policy_vintage_weekly ; by policy_vintage run_date; run;_work.policy....是我的历史数据集
    【解决方案2】:

    这只需要在每个 policy_vintage 的第一个上完成。

    data _work.policy_vintage_weekly;
    set policy_vintage_weekly_all;
    by policy_vintage;
    diff_value = dif(number_policy);
    if first.policy_vintage then diff_value = .;
    run;
    

    顺便说一句:如果您的流程有一天中断并且您需要在同一天重新运行它,会发生什么?如果有部分负载会发生什么?

    【讨论】:

    • 说实话,我没有考虑,但我猜如果我当天运行,这段代码对它没有影响,因为每天都会将数据添加到库中。至于你的代码,我想我之前有过这个解决方案,但它仍然会减去我在 2021.08 - 2021.09 等日期之间的结果。我希望它只从 2021.09 - 2021.09 中减去,例如或 2021.08.-2021.08 不反转
    • 也许您有更好的选择或建议。我真的是新来的。
    • 鉴于您发布的示例,此解决方案有效。如果没有,请说明如何使用示例数据来修改代码。我只能根据显示的数据和预期的输出来测试它,并且从你到目前为止所展示的内容来看,这对 IMO 有效。
    • 仅供参考-我认为您从一开始就犯了一个错误。我怀疑你在某个地方有一个完整的历史数据集,你需要每周用一个每周变量来总结它。我也在保险业工作,政策一直在变化和更新,所以使用条目的日期没有用,除非在极少数情况下。通常,您已经在数据集中的日期上进行聚合,而不是添加运行日期,除非您正在执行 ETL 加载。
    • 是的,所以我需要每周比较是否有任何政策已更新或过期。所以我做错了?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-13
    • 2021-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-20
    相关资源
    最近更新 更多