2

コホート分析が必要なため、各顧客の次のアクション (サブスクリプション解除、アップグレード、ダウングレード...) を取得しようとしています。

次のデータを含む月次スナップショットがあります。

customer | month      | last_action   | last_action_date
1          01-01-2012   subscription    01-01-2012
1          02-01-2012   subscription    01-01-2012
1          03-01-2012   subscription    01-01-2012
1          04-01-2012   downgrade       04-01-2012
1          05-01-2012   downgrade       04-01-2012
1          06-01-2012   downgrade       04-01-2012
1          07-01-2012   unsubscription  07-01-2012

ご覧のとおり、アクションは実行された月にのみわかります。2012 年 1 月 1 日の時点では、顧客が 2012 年 4 月 1 日にダウングレードしたかどうかはまだわからないため、彼の使用行動を相対的に分析することはできません。彼の格下げ月に。退会についても同様です。

必要なデータセットは次のとおりです。

customer | month      | downgrade_date   | unsubscription_date
1          01-01-2012   04-01-2012         07-01-2012
1          02-01-2012   04-01-2012         07-01-2012
1          03-01-2012   04-01-2012         07-01-2012
1          04-01-2012   12-31-9999         07-01-2012
1          05-01-2012   12-31-9999         07-01-2012
1          06-01-2012   12-31-9999         07-01-2012
1          07-01-2012   12-31-9999         07-01-2012

last_value 分析関数を使用してサブスクリプション解除日を簡単に取得できましたが、ダウングレード日を取得する方法が見つかりませんでした。

ここに私のSQLクエリがあります:

SELECT month_id, 
       customer_id,
       CASE 
         WHEN LAST_VALUE(last_action) OVER (PARTITION BY customer_id ORDER BY month_id RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) = 'unsubscription' THEN LAST_VALUE(last_action_date) OVER (PARTITION BY customer_id ORDER BY month_id RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING)    
         ELSE TO_DATE('99991231', 'yyyymmdd')
       END unsubscription_date
FROM my_table
;

「downgrade_date」のように「次の」アクションの日付を取得する方法。

オラクルを使用しています。

4

1 に答える 1

1

Oracle 11 では、次lead()ignore nullsオプションを使用してこれを行うことができます。

select customer, MONTH,
       lead(case when last_action = 'downgrade' then last_action_date end ignore nulls) over
                 (partition by customer order by month desc) as downgrade_date,
       lead(case when last_action = 'unsubscription' then last_action_date end ignore nulls) over
                 (partition by customer order by month desc) as downgrade_date,
from my_table t

をお持ちでない場合はignore nulls、次のようにして同様のことができますmin()

select customer, MONTH,
       min(case when last_action = 'downgrade' then last_action_date end) over
                (partition by customer order by month range between current and unbounded following
                ) as downgrade_date,
       min(case when last_action = 'unsubscription' then last_action_date end) over
                (partition by customer order by month range between current and unbounded following
                ) as unsubscription_date
from my_table t  
于 2013-04-30T14:07:59.223 に答える