Plsql SAS/SQL分组依据并保留所有行
我有一个这样的表,及时观察一些帐户的行为,这里有两个帐户,acc_ID为1和22: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 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