ORACLE SQL仅返回重复值(不是原始值)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ORACLE SQL仅返回重复值(不是原始值)相关的知识,希望对你有一定的参考价值。
我有一个包含以下信息的数据库
Customer_id, plan_id, plan_start_dte,
由于一些客户转换计划,有些客户有几个重复的customer_id
s,但有不同的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'
然后按日期分组并进行计数。有人有主意吗?
答案
我想你想要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;
以上是关于ORACLE SQL仅返回重复值(不是原始值)的主要内容,如果未能解决你的问题,请参考以下文章
SQL,仅结合两个具有不同值的表(仅基于三个字段,而不是整行)