【问题标题】:SAS SQL - How to get cumulative sum in past X monthsSAS SQL - 如何获得过去 X 个月的累积总和
【发布时间】:2021-07-22 23:47:17
【问题描述】:

我有一张这样的桌子:

我想根据 date_ini 和今天计算过去 x 个月中每个 cust_id 列“total”的累积总和,所以我的输出是:

你能帮我在 sas / proc sql 中做这件事吗?

谢谢!

【问题讨论】:

  • 对不起,你什么意思?
  • 请以文字而非照片的形式发布数据。请展示您尝试过的代码,并解释它是如何没有得到您需要的。
  • @user8419142 。 . .使用数据步骤可能更容易。
  • 为了帮助您,我们必须输入您的数据,然后编写解决方案。根据关于如何提出问题How to Ask 的 SO 指南,您也没有显示到目前为止您尝试过的任何内容。请至少以文本形式发布您的数据,并包括您迄今为止尝试过的内容。还要解释为什么需要 SQL,因为 PROC 或 DATA 步骤在这里更有效。

标签: sql sas proc-sql enterprise-guide


【解决方案1】:

可以使用带有分组和范围限制条件的自联接使用 SQL 计算累积结果。

例子:

data have;
  call streaminit(2021);
  do id = 1 to 10;
    do date = '01jan2017'd to '31dec2020'd;
      x = rand('integer', 10);
      if rand('uniform') < 0.20 then output;
    end;
  end;
  format date date9.;
run;

proc sql;
  create table want as
  select 
    self.id,
    self.date,
    self.x,
    count(earlier.date) as date_count,
    sum(earlier.x) as x_sum_36mo
  from 
    have as self
  left join 
    have as earlier
  on
    self.id = earlier.id and
    earlier.date between self.date and intnx('month', self.date, -36)
  group by
    self.id, self.date, self.x
  ;

SAS DATA 步中的 DOW 循环性能更高,并且可以在单次遍历数据期间计算多个累积周期。这样的代码可以在前面的问题中找到。

【讨论】:

    【解决方案2】:

    看起来您只是想使用 CASE 来决定 TOTAL 是否有助于您的新总和。

    因此,假设您的参考日期是当前日期,您可能会使用类似这样的日期。

    create table want as
      select cust_id
           , sum(case
                 when (date_ini >= intnx('month',today(),-1,'b') then total
                 else 0 end) as total_last_month
           , sum(case
                 when (date_ini >= intnx('month',today(),-36,'b') then total
                 else 0 end) as total_last_36months
      from have
      group by cust_id
    ;
    

    但我不确定我是否会称这些累积金额。

    【讨论】:

    • 谢谢!!如果我想使用格式为“YYYYMM”的月份而不是今天()作为参考日期怎么办?
    • 要确定日期,您需要一个月中的某一天,通常使用该月的第一天,这应该与 INTNX() 一起使用。要在 SAS 中指定数据文字,您需要采用 DATE 信息可以读取的样式。如'01MAY2021'd。如果您在同一观察中有一个日期变量,您可以参考它。如果您的变量是 '202105' 之类的字符,则使用 input() 函数将其转换为日期。 input(chdatevar,yymmn6.)
    • 感谢您的帮助!!问题是我想对 total_last_36months 求和,但在我从 date_ini 获得的固定月份内,例如:对于每个 YYYYMM(基于 date_ini 创建)总和,如果 date_ini 在 date_ini-36 个月和 date_ini 之间。清楚吗?不知道我表达清楚了没有:)
    • stackoverflow.com/questions/67420988/… 这是更好解释的问题:)
    猜你喜欢
    • 1970-01-01
    • 2015-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-08
    • 2018-06-28
    • 1970-01-01
    相关资源
    最近更新 更多