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

Sql 查找特定事件发生的最早日期,sql,sas,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-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天内收到优惠券):

到目前为止,我的代码是:

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天内收到优惠券,但我不确定如何将其标记为特定程序ID

在procsql中是否有这样做的方法

抱歉,这让人困惑


谢谢,

你能试试下面的查询吗?不确定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

请告诉我。

为什么使用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;
proc sort data=have;
按ID程序ID开始日期优惠券日期;
跑
数据需求;
集有;
按id编程;
匹配=0;
如果programID=83435
首先是programmaid

优惠券日期开始日期我不清楚你到底在问什么。你能给出一个更具体的例子来说明程序ID是如何影响的吗?现在,假设userID=1的前两行有相同的程序,但不同的开始日期,我不清楚这应该如何工作。是否需要为每个
PROGRAMID
分别设置列,显示他们是否在30天内收到优惠券?我尝试了这个查询,是的,它将程序id分组在一起。但是,这对标记特定的程序id没有任何作用。我认为匹配标志应该返回特定程序id的值。到目前为止,这是标记用户在开始日期后30天内收到优惠券的任何情况,而不仅仅是最早的开始日期。
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;