2014-12-01 26 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;