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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ORACLE SQL仅返回重复值(不是原始值)相关的知识,希望对你有一定的参考价值。

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

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'然后按日期分组并进行计数。有人有主意吗?

答案

我想你想要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,仅结合两个具有不同值的表(仅基于三个字段,而不是整行)

Oracle SQL TO_CHAR 函数返回值

sql Oracle:仅当值存在时才从另一个表中插入值

检查数组中的重复条目,但仅返回重复的值 [重复]

Oracle:PL/SQL 中查看值是不是存在的最快方法:列表、VARRAY 或临时表

在 Oracle SQL 中求和逗号分隔值