【问题标题】:SAS Count number of changes between consecutive time periodsSAS Count 连续时间段之间的变化次数
【发布时间】:2019-01-07 11:39:24
【问题描述】:

Proc SQL 版本=9.4。没有可使用的 Windows 功能。

有客户id、时间段(月)、金额和对应的类别。

client_id   data_period       amount    class 

1           200801            30000     2
2           200801            17000     1
3           200801            9000      1
1           200802            30000     2
2           200802            55555     2
3           200802            11000     2

阈值金额 = 20 000。

amount > 20k 得到 class= 2,amount class= 1

client_id = 1,200801 和 200802 的数量和类别相同。 client_id = 2,数量从 17k 增加到 55.5k,类更改正确,从 1 到 2。 client_id =3,数量在同一类1(

想要的结果是

client_id   oldDate   newDate   AmtOld    AmtNew   ClassOld ClassNew  Good Bad
    2        200801   200802    17000     55555    1        2         1    0
    3        200801   200802     9000     11000    1        1         0    1

我尝试应用自联接来获取 btw 数据周期的所有差异,但输出中的行太多。下面的数据不是来自上面的例子,是实数。

client_id oldDate newDate AmtOld      AmtNew   ClassOld ClassNew

A001687463 200808 200802 -5613        1690386  I03      I04
A001687463 200807 200802 -5613        1690386  I03      I04
A001687463 200806 200802 -5613        1690386  I03      I04
A001687463 200805 200802 -5613        1690386  I03      I04 

PROC SQL;
   CREATE TABLE WORK.'Q'n AS 

   SELECT distinct

t1.client_id, t1.data_period as oldDate, t2.data_period as newDate, t1.amount as expAmtOld, t2.amount as expAmtNew, t1.class as classOld, t2.class as classNew

   FROM WORK.'E'n t1,  WORK.'E'n t2
   where
    t1.client_id = t2.client_id and 
    t1.amount <> t2.amount
    order by t1.client_id;

【问题讨论】:

  • 不要尝试用SQL做顺序处理。只需使用数据步骤。您也无法运行 SAS 版本 7.13。您可能正在使用某些 9.x 版本。 7.13 可能只是帮助您向 SAS 提交代码的 Enterprise Guide GUI 界面中的版本号。
  • 示例结果中的数据与示例输入中的数据不匹配。
  • 嗨,汤姆!这只是一个例子,数据不是真的匹配。
  • proc sql 版本=9.4
  • 我无法理解您的规则实际上是什么。 20K与这个问题有什么关系?你怎么知道某事是否正确?您在搜索什么时间段?连续时间段是什么意思?输入和预期输出的简单示例将有助于澄清您在说什么。

标签: sas proc-sql


【解决方案1】:

不要尝试使用 SQL 进行顺序处理。它不是为此而构建的。

在数据步骤中应该很容易做到。例如,让我们将您的打印输出转换为实际的 SAS 数据集,以便我们可以编写代码。

data have ;
  input client_id data_period amount class ;
cards;
1 200801 30000 2
2 200801 17000 1
3 200801 9000  1
1 200802 30000 2
2 200802 55555 2
3 200802 11000 2
;

让我们按客户和时期对其进行排序。

proc sort data=have ;
  by client_id data_period ;
run;

现在只需设置数据并使用 LAG() 函数获取之前的值。 不确定您对 GOOD 和 BAD 的定义是什么,所以我只是根据您的 20K 规则创建了新的类变量。

data want ;
  set have ;
  by client_id;
  old_period = lag(data_period);
  old_class = lag(class);
  newclass = 1 + (amount > 20000) ;
  old_newclass = lag(newclass);
  if first.client_id then call missing(of old_:);
  bad = (class ne newclass) or (old_newclass ne old_class) ;
run;

所以这里是结果。

client_     data_                        old_      old_                  old_
   id      period    amount    class    period    class    newclass    newclass    bad

   1       200801     30000      2           .      .          2           .        0
   1       200802     30000      2      200801      2          2           2        0
   2       200801     17000      1           .      .          1           .        0
   2       200802     55555      2      200801      1          2           1        0
   3       200801      9000      1           .      .          1           .        0
   3       200802     11000      2      200801      1          1           1        1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-26
    • 2010-10-28
    • 2015-03-26
    相关资源
    最近更新 更多