我试图找出用户是否在他们进入程序的最早日期的30天内收到了优惠券。每个用户都可以进入许多程序,我试图标记某个程序的最早日期。这将是一些示例数据:
USERID START_DATE PROGRAMID COUPON_DATE
1 2003-02-05 83435 2003-03-01
1 2004-05-04 83435 2005-03-05
1 2002-01-30 82222 2001-02-24
2 2001-02-02 82222 2001-04-22
2 2000-04-03 22222 2004-12-13
2 1999-02-05 83435 1999-05-02
2 2005-05-28 83435 2008-02-02
3 1998-01-01 24853 1999-02-02
3 2006-03-02 44533 2006-05-02
我想要的输出看起来像这样(用于查找是否有人在进入程序83435后的30天内收到优惠券):
USERID START_DATE PROGRAMID COUPON_DATE MATCH
1 2003-02-05 83435 2003-03-01 1
1 2004-05-04 83435 2005-03-05 0
1 2002-01-30 82222 2001-02-24 0
2 2001-02-02 82222 2001-04-22 0
2 2000-04-03 22222 2004-12-13 0
2 1999-02-05 83435 1999-05-02 0
2 2005-05-28 83435 2008-02-02 0
3 1998-01-01 24853 1999-02-02 0
3 2006-03-02 44533 2006-05-02 0
到目前为止我的代码是:
proc sql;
create table programmatch as
select users.*,
case when (min((start_date) +30) >= coupon_date) then 1
else 0 end as match
from users
ORDER BY USERID;
quit;
此代码仅标记某人是否在30天内收到优惠券,但我不确定如何为特定的节目标记进行标记。
有没有办法在proc sql中执行此操作?
很抱歉,如果这令人困惑。
谢谢,
答案 0 :(得分:0)
您可以尝试以下查询吗?不确定group by是否适用于case。
SELECT USERID, PROGRAMID, CASE when (min((start_date) +30) >= coupon_date) then 1 else 0 end as match
FROM USERS
GROUP BY USERID, PROGRAMID
ORDER BY USERID
请告诉我。
答案 1 :(得分:0)
为何选择SQL?使用第一个/最后一个处理的数据步骤使这很容易,但它是基于您的程序的硬编码解决方案,因为任何SQL也是如此。
proc sort data=have;
by ID programID start_date coupon_date;
run;
data want;
set have;
by id programID;
match=0;
if programID = 83435
and first.programID
and coupon_date-start_date<=30
then match=1;
run;