2017-02-15 8 views
0

に数を割り当てるには、ウィンドウ関数を使用することができます...、どのように私は私が実際にそこにそれをすべて詰め込むことを試みたが、ここで私が助けを必要とするものだならば、タイトルがあまりにも長ったらしいだろう、前の行の日付

ユーザーの保存期間を計算しようとしています。ユーザーには、割り当て開始日と割り当て終了日が重複する可能性があります。私がする必要があることは、すべての候補者割り当てを見て、それらが保持されているかどうかを判断することです(前回と新しい開始の間で30日以内)。難しい部分:前回の割り当て終了日にクレジットクレジットを割り当てる必要があります。ここではデータのプレビューです:

month | user_id | start_date | end_date | rank | days_btw_assignment 
    1  5  1-1-16  1-31-16  1  NULL 
    2  5  2-14-16  4-15-16  2  15 
    6  4  6-01-16 11-01-16  1  NULL 
    8  4  8-01-16 11-01-16  2  -81 

したがって、ユーザ5のために、私は彼らの割り当ての終了日は1-31-16を終了しているため1月 - 16' 月のに保持の信用を与える必要があるだろう。割り当てが重複するユーザー4の場合、前回の割り当て終了日が11月1日〜16日に終了するため、nov-16 'に保存クレジットを付与します。

私は、この例では2つの割り当てしか持たないケースを使用するように制限しましたが、それ以上のものもあります。私は正しい方向に一歩を踏み出すだけで、他のユースケースはすべて自分で処理できます。ここで

は、私が現在使用しているサンプルコードです:

with placement_facts as (select date_trunc('month',assignment_start_date) as month, user_id, assignment_start_date, assignment_end_date, rank() over (partition by user_id order by assignment_start_date asc), extract(day from assignment_start_date - lag(assignment_end_date, 1) over (partition by user_id order by assignment_start_date asc)) as time_btw_placement 
from activations as ca 
join offers on ca.offer_id = offers.id 
where assignment_start_date != assignment_end_date 
order by 2,4 asc) 
select placement_facts.month, count(distinct case when time_btw_placement <=30 then user_id else null end) as retained_raw 
from placement_facts 
group by 1; 

は助けに感謝し、私は何かを明確にするために旧姓場合LMKしてください!

+0

サンプルデータと必要な出力を共有してください。 –

答えて

0

私はあなたの質問を理解すれば、LAG()の代わりにLEAD()を使用して、あなたが望むものを達成できると思います。基本的には同じ機能ですが、与えられた行数を先に参照します。

関連する問題

 関連する問題