SAS-比较组内的观察值以选取值

SAS-比较组内的观察值以选取值,sas,sas-macro,proc-sql,datastep,Sas,Sas Macro,Proc Sql,Datastep,我的SAS数据集中有4列,如下图所示。我需要按ID比较连续行的日期。对于每个ID,如果相同ID的Date2出现在下一行的Date1之前,则保留账单金额。如果Date2发生在下一行的Date1之后,则删除票据金额。因此,对于每个ID,只保留日期2小于下一行日期1的账单。我已经在底部放置了结果集的外观 结果集应类似于 您需要创建一个新变量,将下一行的DATE1上移一行以进行比较。假设您的日期变量为日期格式,请使用PROC EXPAND进行比较,以确保您没有比较缺少前置值的最后一个值: DATA T

我的SAS数据集中有4列,如下图所示。我需要按ID比较连续行的日期。对于每个ID,如果相同ID的Date2出现在下一行的Date1之前,则保留账单金额。如果Date2发生在下一行的Date1之后,则删除票据金额。因此,对于每个ID,只保留日期2小于下一行日期1的账单。我已经在底部放置了结果集的外观

结果集应类似于

您需要创建一个新变量,将下一行的DATE1上移一行以进行比较。假设您的日期变量为日期格式,请使用
PROC EXPAND
进行比较,以确保您没有比较缺少前置值的最后一个值:

DATA TEST;
    INPUT ID: $3. DATE1: MMDDYY10. DATE2: MMDDYY10. BILL: 8.;
    FORMAT DATE1 DATE2 MMDDYY10.;
    DATALINES;
    AA      07/23/2015      07/31/2015  34
    AA      07/30/2015      08/10/2015  50
    AA      08/12/2015      08/15/2015  18
    BB      07/23/2015      07/24/2015  20  
    BB      07/30/2015      08/08/2015  20
    BB      08/06/2015      08/08/2015  20
    ;
RUN;

PROC EXPAND DATA = TEST OUT=TEST1 METHOD=NONE;
    BY ID;
    CONVERT DATE1 = DATE1_LEAD / TRANSFORMOUT=(LEAD 1);
RUN;

DATA TEST2; SET TEST1;
    IF DATE1_LEAD NE . AND DATE2 GT DATE1_LEAD THEN BILL=.;
RUN;

您需要创建一个新变量,将下一行的DATE1上移一行以进行比较。假设您的日期变量为日期格式,请使用
PROC EXPAND
进行比较,以确保您没有比较缺少前置值的最后一个值:

DATA TEST;
    INPUT ID: $3. DATE1: MMDDYY10. DATE2: MMDDYY10. BILL: 8.;
    FORMAT DATE1 DATE2 MMDDYY10.;
    DATALINES;
    AA      07/23/2015      07/31/2015  34
    AA      07/30/2015      08/10/2015  50
    AA      08/12/2015      08/15/2015  18
    BB      07/23/2015      07/24/2015  20  
    BB      07/30/2015      08/08/2015  20
    BB      08/06/2015      08/08/2015  20
    ;
RUN;

PROC EXPAND DATA = TEST OUT=TEST1 METHOD=NONE;
    BY ID;
    CONVERT DATE1 = DATE1_LEAD / TRANSFORMOUT=(LEAD 1);
RUN;

DATA TEST2; SET TEST1;
    IF DATE1_LEAD NE . AND DATE2 GT DATE1_LEAD THEN BILL=.;
RUN;

如果您对数据进行排序,以便查看以前的obs来比较日期,则可以在数据步骤中使用。

如果您对数据进行排序,以便查看以前的obs来比较日期,则可以在数据步骤中使用。

谢谢。LAG函数很有趣,我将研究它以获得更复杂的行比较。谢谢。LAG函数很有趣,我将研究它以获得更复杂的行比较。