简体   繁体   中英

ORACLE SQL Return only duplicated values (not the original)

I have a database with the following info

Customer_id, plan_id, plan_start_dte,

Since some customer switch plans, there are customers with several duplicated customer_id s, but with different plan_start_dte . I'm trying to count how many times a day members switch to the premium plan from any other plan ( plan_id = 'premium' ).

That is, I'm trying to do roughly this: return all rows with duplicate customer_id , except for the original plan ( min(plan_start_dte) ), where plan_id = 'premium' , and group them by plan_start_dte .

I'm able to get all duplicate records with their count:

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

The other steps have me stuck. First I tried to select everything except the original plan:

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

But this failed. If I can solve this I believe all I have to add is an additional condition where c.PLAN_ID = 'premium' and then group by date and do a count. Anyone have any ideas?

I think you want 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';

I'm not sure what output you want. For the number of times this occurs per day:

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;

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM