ORACLE SQL仅返回重复值(不是原始值)

问题描述 投票:0回答:1

我有一个包含以下信息的数据库

Customer_id, plan_id, plan_start_dte,

由于一些客户转换计划,有些客户有几个重复的customer_ids,但有不同的plan_start_dte。我试图计算一天成员从任何其他计划(plan_id = 'premium')切换到高级计划的次数。

也就是说,我正在尝试大致这样做:返回所有行的重复customer_id,除了原始计划(min(plan_start_dte)),其中plan_id = 'premium',并由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'然后按日期分组并进行计数。有人有主意吗?

sql oracle duplicates
1个回答
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';

我不确定你想要什么输出。对于每天发生的次数:

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;
© www.soinside.com 2019 - 2024. All rights reserved.