2014-12-01 95 views
0

我想知道用户是否在他们输入程序的最早日期的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天之内的优惠券,但我不确定如何使它标记特定programid为好。

有没有办法在proc sql中做到这一点?

对不起,如果这是混乱。

感谢,

+1

我不清楚你究竟在问什么。你能举一个更具体的例子来说明programID的含义吗?现在给userID = 1有相同的程序,但前两行的开始日期不同,这对我来说不是很明显。 – Joe 2014-12-01 22:59:44

+0

您是否需要为每个“PROGRAMID”单独列显示他们是否在30天内获得了优惠券? – mjsqu 2014-12-02 00:34:15

回答

0

能否请你尝试下面的查询?不确定小组是否与案例一起工作。

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 

请让我知道。

+0

我试过查询,是的,它的工作原理是将程序ID分组在一起。然而,这并没有做任何关于标记一个特定的programid以及 – Mixcels 2014-12-01 23:05:41

+0

我认为匹配标志应该返回一个特定的程序ID值? – 2014-12-01 23:07:37

+0

到目前为止,这标记了用户在开始日期后30天内收到优惠券的任何情况,而不仅仅是最早的开始日期。 – Mixcels 2014-12-01 23:14:53

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;