SAS按帐户分配号码和分区

时间:2017-04-18 19:12:49

标签: sas sas-macro enterprise-guide

我使用SAS EG并拥有一个如下所示的数据集:

CLIENT_ID    Segment     Yearmonth
XXXX         A            201305
XXXX         A            201306
XXXX         A            201307
YYYY         A            201305
YYYY         A            201306
YYYY         B            201307

我想要一个分配给新列的编号的输出,当新帐户存在时会重置:

CLIENT_ID    Segment      Yearmonth    New_Variable    
XXXX         A            201305         1
XXXX         A            201306         2
XXXX         A            201307         3
YYYY         A            201305         1
YYYY         A            201306         2
YYYY         B            201307         3

这是第一个问题,我用这段代码解决了这个问题:

PROC SORT DATA= GENERAL.HISTORICAL_SEGMENTS;
by Client_ID;
RUN;

data HISTORICAL_SEGMENTS2;
SET GENERAL.HISTORICAL_SEGMENTS;
count + 1;
by Client_ID;
if first.Client_ID then count = 1;
run;

我想创建第二个数据集,我想看看是否有一种方法只在段变化时获取段:例如从上面的

CLIENT_ID    Segment      Yearmonth    New_Variable
YYYY         A            201305         1
YYYY         B            201306         2

任何帮助将不胜感激。谢谢。

1 个答案:

答案 0 :(得分:1)

很好地回答你的第一个问题。如果你重新安排一下,我认为这一步更清楚,例如:

data HISTORICAL_SEGMENTS2 ;
  set GENERAL.HISTORICAL_SEGMENTS ;
  by Client_ID ;
  if first.Client_ID then count = 0 ;
  count + 1 ;
run;

我认为习惯上将BY语句放在它适用的SET语句之后,为了清楚起见。当Client_ID发生变化时,将计数器重置为0。

看起来你想要第二个数据集,称之为FIRSTS,每个数据集来自每个组。要做到这一点,请注意,一个DATA步骤可以写入多个输出数据集。这可以通过使用显式OUTPUT语句写入每个数据集来完成,例如, :

data HISTORICAL_SEGMENTS2 FIRSTS ;
  set GENERAL.HISTORICAL_SEGMENTS ;
  by Client_ID ;
  if first.Client_ID then count = 0 ;
  count + 1 ;
  output HISTORICAL_SEGMENTS2 ; *output every record;
  if first.Client_ID then output FIRSTS ;  *output first of each group;
run;