Plsql SAS/SQL分组依据并保留所有行

Plsql SAS/SQL分组依据并保留所有行,plsql,group-by,sas,proc-sql,Plsql,Group By,Sas,Proc Sql,我有一个这样的表,及时观察一些帐户的行为,这里有两个帐户,acc_ID为1和22: acc_id date mob 1 Dec 13 -1 1 Jan 14 0 1 Feb 14 1 1 Mar 14 2 22 Mar 14 10 22 Apr 14 11 22 May 14 12 我想创建一个列orig_date,如果mob=0则该列等于date,如果

我有一个这样的表,及时观察一些帐户的行为,这里有两个帐户,acc_ID为1和22:

acc_id   date    mob
  1      Dec 13   -1
  1      Jan 14    0
  1      Feb 14    1
  1      Mar 14    2
  22     Mar 14    10
  22     Apr 14    11
  22     May 14    12
我想创建一个列
orig_date
,如果
mob=0
则该列等于
date
,如果
acc_id
没有
mob=0
,则该列至少等于
date

因此,预期产出为:

acc_id   date    mob   orig_date
  1      Dec 13   -1     Jan 14
  1      Jan 14    0     Jan 14
  1      Feb 14    1     Jan 14
  1      Mar 14    2     Jan 14
  22     Mar 14    10    Mar 14
  22     Apr 14    11    Mar 14
  22     May 14    12    Mar 14
第二个帐户没有
mob=0
观察,因此
orig_date
按组设置为
min(date)


在SAS中是否有某种方法可以实现这一点,最好是通过一个
proc sql
步骤来实现?

以下是一种数据步骤方法

data have;
input acc_id date $ mob;
datalines;
1  Dec13 -1
1  Jan14  0
1  Feb14  1
1  Mar14  2
22 Mar14  10
22 Apr14  11
22 May14  12
;

data want;
    do until (last.acc_id);
        set have;
        by acc_id;
        if first.acc_id then orig_date=date;
        if mob=0 then orig_date=date;
    end;
    do until (last.acc_id);
        set have;
        by acc_id;
        output;
    end;
run;

看起来很简单。只需用两种方法计算最小日期,然后使用coalesce()选择所需的日期

首先,让我们将打印输出转换为实际的数据集

data have ;
  input acc_id date :anydtdte. mob ;
  format date date9.;
cards;
1      Dec13   -1
1      Jan14    0
1      Feb14    1
1      Mar14    2
22     Mar14    10
22     Apr14    11
22     May14    12
;
要查找MOB=0的日期,请使用CAsE子句。PROC SQL将自动将ACC_ID级别计算的MIN()聚合结果重新合并到所有详细信息行中

proc sql ;
create table want as
select *
     , coalesce( min(case when mob=0 then date else . end)
               , min(date)
               ) as orig_date format=date9.
from have
group by acc_id
order by acc_id, date 
;
quit;
结果:

Obs    acc_id         date    mob    orig_date

 1        1      01DEC2013     -1    01JAN2014
 2        1      01JAN2014      0    01JAN2014
 3        1      01FEB2014      1    01JAN2014
 4        1      01MAR2014      2    01JAN2014
 5       22      01MAR2014     10    01MAR2014
 6       22      01APR2014     11    01MAR2014
 7       22      01MAY2014     12    01MAR2014