Sas 带中频条件的分组逻辑

Sas 带中频条件的分组逻辑,sas,sas-macro,Sas,Sas Macro,我有一个结构如下的数据集: CLIENT_ID Segment Yearmonth XXXX A 201305 XXXX A 201306 XXXX B 201307 XXXX B 201308 XXXX C

我有一个结构如下的数据集:

CLIENT_ID    Segment      Yearmonth       
XXXX         A            201305         
XXXX         A            201306         
XXXX         B            201307         
XXXX         B            201308         
XXXX         C            201309         
XXXX         A            201310        
YYYY         D            201306
YYYY         D            201307
YYYY         C            201308
YYYY         D            201309
ZZZZ         E            201309
ZZZZ         E            201309
ZZZZ         E            201309
这就是我想要得到的结果

CLIENT_ID    Segment       New_sequencing_Variable    
XXXX         A                       1
XXXX         B                       2
XXXX         C                       3
XXXX         A                       4
YYYY         D                       1
YYYY         C                       2
YYYY         D                       3
ZZZZ         E                       1
到目前为止,我掌握的代码是:

HISTORICAL_SEGMENTS2 HISTORICAL_SEGMENTS3 ;
  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 HISTORICAL_SEGMENTS3 ;  *output first of each group;
run;
我需要像这样的东西:

 if previous.segment <> current.segment then output HISTORICAL_SEGMENTS3 
如果是previous.segment current.segment,则输出历史_SEGMENTS3
但是,我能够在输出表HISTORICAL_SEGMENTS3中获取第一个clientID、段和序列变量,但只能获取第一个客户端ID及其旁边的段,而只能获取第一条记录

在按客户机id和yearmonth分组时,如何包含输出的逻辑
基本上,每次段与前一年月段不同时,都会输出一行。基本上,您已经存在了。只需为历史_SEGMENTS3数据集添加另一个计数变量,并为segment的先前观测添加一个滞后变量

data HISTORICAL_SEGMENTS2 HISTORICAL_SEGMENTS3;
    set HISTORICAL_SEGMENTS;
    by Client_ID;
    if first.Client_ID then do;
        count = 0;
        count2 = 0;
    end;
    count + 1;

    prev_segment = lag(segment);
    if prev_segment ne segment then do;
        count2 + 1;
        output HISTORICAL_SEGMENTS3;
    end;
    output HISTORICAL_SEGMENTS2;
    drop prev_segment;
run;

你基本上已经在那里了。只需为历史_SEGMENTS3数据集添加另一个计数变量,并为segment的先前观测添加一个滞后变量

data HISTORICAL_SEGMENTS2 HISTORICAL_SEGMENTS3;
    set HISTORICAL_SEGMENTS;
    by Client_ID;
    if first.Client_ID then do;
        count = 0;
        count2 = 0;
    end;
    count + 1;

    prev_segment = lag(segment);
    if prev_segment ne segment then do;
        count2 + 1;
        output HISTORICAL_SEGMENTS3;
    end;
    output HISTORICAL_SEGMENTS2;
    drop prev_segment;
run;

这可以通过命令“notsorted”简单地实现

我的输出:

client_id   segment       new_sequencing_variable    
XXXX         A                       1
XXXX         B                       2
XXXX         C                       3
XXXX         A                       4
YYYY         D                       1
YYYY         C                       2
YYYY         D                       3
ZZZZ         E                       1  

如果有任何澄清,请告诉我

这可以通过命令“notsorted”简单地实现

我的输出:

client_id   segment       new_sequencing_variable    
XXXX         A                       1
XXXX         B                       2
XXXX         C                       3
XXXX         A                       4
YYYY         D                       1
YYYY         C                       2
YYYY         D                       3
ZZZZ         E                       1  

如果有任何澄清,请告诉我

谢谢你!!这正是我需要的。谢谢你!!这正是我需要的。