2016-04-24 12 views
0

私はいくつかのカスタマースイッチ計画ので、以下の情報ORACLE SQL戻りのみ重複値(オリジナルではない)

Customer_id, plan_id, plan_start_dte, 

でデータベースを持っている、いくつかの重複customer_id sの顧客は、異なるplan_start_dteと、があります。私は、メンバーが他のプラン(plan_id = 'premium')からプレミアムプランに何回切り替えたのかを数えようとしています。 plan_id = 'premium'当初の計画(min(plan_start_dte))を除き、重複customer_idですべての行を返し、plan_start_dteでグループにそれらを:私は大体これをやろうとしている、ある

私は自分のカウントで、すべての重複レコードを取得することができるよ:

with plan_counts as (
    select c.*, count(*) over (partition by CUSTOMER_ID) ct 
    from CUSTOMERS c 
) 
select * 
from plan_counts 
where ct > 1 

他のステップは私がスタックしています。最初に、元の計画以外のすべてを選択しようとしました:

SELECT CUSTOMERS c 
where START_DTE not in (
    select min(PLAN_START_DTE) 
    from CUSTOMERS i 
    where c.CUSTOMER_ID = i.CUSTOMER_ID 
) 

これは失敗しました。私がこれを解決できれば、私が追加しなければならないのは、c.PLAN_ID = 'premium'というグループの追加条件です。誰でもアイデアはありますか?

答えて

0

私はあなたがlag()をしたいと思う:

select c.* 
from (select c.*, 
      lag(plan_id) over (partition by customer_id order by plan_start_date) as prev_plan_id 
     from customers c 
    ) c 
where prev_plan_id <> 'premium' and plan_id = 'premium'; 

私はあなたが欲しいものを出力わかりません。 1日に発生する回数:

select plan_start_date, count(*) 
from (select c.*, lag(plan_id) over (partition by customer_id order by plan_start_date) as prev_plan_id 
     from customers c 
    ) c 
where prev_plan_id <> 'premium' and plan_id = 'premium' 
group by plan_start_date 
order by plan_start_date; 
+0

この機能には「ウィンドウの指定がありません」が表示されますか?それはover陳述が欠けていますか?ユーザーがプランを4回変更し、4回目のプレミアムがプレミアムである場合は、これを数えたいと思うだけです。それをちょっと試してみると、次のようなものがあります(オリジナルではないプレミアムプラン) select * from (select c。*、lag(plan_id)over(order by plan_start_dte)prev_plan_id from customer_hist C )C WHERE prev_plan_idは AND PLAN_ID =「プレミアム」 NULLではありませんが、私は月によってその上に集約したときに数字が –

+0

ええ、私は私が遅れ正しい方法を使用していない実現しています高いようです。顧客IDの各プランの前にプランが存在しない場合は、何らかのフラグを付けて(null値で)使用しようとしていました。 –