查找特定事件发生的最早日期

时间:2014-12-01 21:56:29

标签: sql sas

我试图找出用户是否在他们进入程序的最早日期的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中执行此操作?

很抱歉,如果这令人困惑。

谢谢,

2 个答案:

答案 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;