SAS 分配编号和按帐户分区

SAS assigning numbers and partitioning by account

我使用 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

如有任何帮助,我们将不胜感激。谢谢。

很高兴回答您的第一个问题。我认为如果您重新排列一下,该步骤会更清楚,例如:

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,其中包含每个组的第一条记录。为此,请注意,一个数据步骤可以写入多个输出数据集。这可以通过使用显式 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;