2016-08-12 2 views
1

一部の製品の購入日をリストするデータセットがあります。また、別のデータセットには、各製品のマーケティングキャンペーンのさまざまなフェーズのカット日付が記載されています。マーケティングキャンペーンのどの段階で購入日が発生するかに応じて、各購入日に段階番号(1〜n)を割り当てる必要があります。各製品にはそれぞれ異なるカットを持つ独自のキャンペーンがあります。日付カットポイントのデータセットを使用して、縦のイベントデータをフェーズに割り当てる方法は?

私の頭では、「各購入イベントの日付ごとに、その製品のマーケティングキャンペーンのカット日付を調べ、購入日現在のカット日付の数を確認し、 1を使用してフェーズ番号を計算します。

だから、のようなデータを持っている:

data have; *Purchase events; 
    input product $1 Date mmddyy10.; 
    format date mmddyy10.; 
    cards; 
A 1/1/2015 
A 3/1/2015 
A 3/1/2015 
A 6/1/2015 
A 9/1/2015 
B 1/1/2015 
B 3/1/2015 
B 6/1/2015 
B 9/1/2015 
C 1/1/2015 
; 
run; 

data cut; *cut dates for marketing campaign; 
input product $1 CutDate mmddyy10. ; 
format cutdate mmddyy10.; 
cards; 
A 2/1/2015 
B 4/1/2015 
B 7/1/2015 
; 
run; 

をと望む:

product   Date Phase 
    A  01/01/2015  1 
    A  03/01/2015  2 
    A  03/01/2015  2 
    A  06/01/2015  2 
    A  09/01/2015  2 
    B  01/01/2015  1 
    B  03/01/2015  1 
    B  06/01/2015  2 
    B  09/01/2015  3 
    C  01/01/2015  1 

私が動作しているよう相関サブクエリのアプローチでプレーしてきたが、そこでなければなりませんように私は感じますより良い方法。

proc sql; 
    create table want as 
    select h.* 
     ,coalesce 
      (
      (select count(*) 
      from cut c 
      where h.product=c.product and c.cutdate<=h.date 
      group by product 
      ) 
      ,0 
     )+1 as Phase 
    from have as h 
    ; 
quit; 

実際のデータには、製品ごとに0〜4つのカット日数と数百万回の購入イベントが含まれています。ハッシュテーブルを使用して、この問題の

+0

私はそれがハッシュテーブルにデータステップで行うことができると思います。 – fl0r3k

+0

おかげさまで@ fl0r3k、あなたは私があなたが何を考えているかについてのヒントを多く与えることができますか?私はカットデータセットをマルチデータハッシュテーブルにロードすることができます(キーはプロダクト、各キーの複数のレコードです)。その後、HAVEデータセットを読み取って、レコードごとにハッシュテーブルで商品を検索し、そのキーのレコードを繰り返して、何回の日付が経過したかを数えます。それはあなたが思っていることですか? – Quentin

+0

あなたは私のfrinds以下の答えを持っています:) – fl0r3k

答えて

3

ソリューション:

data want; 
    if 0 then set cut; 

    if _N_ = 1 then do; 
     declare hash h(dataset: 'cut', multidata: 'y'); 
     h.defineKey('product'); 
     h.defineData('CutDate'); 
     h.defineDone(); 
     call missing(product, CutDate); 
    end; 

    set have; 

    Phase = 1; 
    rc = h.find(); 
    if rc = 0 then do; 
     do while(Date > CutDate and rc = 0); 
      rc = h.find_next(); 
      Phase = Phase + 1; 
     end; 
    end; 
    drop rc; 
run; 
+0

ありがとう、いいね。切断日のない製品(製品Cのような)がPhase = 1を持つように、DOループの外側で 'Phase = 1; 'を動かすことを提案してください。 – Quentin

関連する問題