【问题标题】:ORACLE SQL Return only duplicated values (not the original)ORACLE SQL 只返回重复值(不是原始值)
【发布时间】:2017-12-19 17:19:27
【问题描述】:

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

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】:

    我想你想要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;
    

    【讨论】:

    • 我得到“缺少此功能的窗口规范”?是否缺少 over 声明?澄清一下,如果用户更改了 4 次计划,而第四次是保费,我希望将其计算在内。稍微玩一下,它看起来像下面给了我想要的东西(非原创的高级计划) select * from (select c.*, lag(plan_id) over (order by plan_start_dte) as prev_plan_id from customer_hist c) c WHERE prev_plan_id 不是 NULL 并且 PLAN_ID = 'premium' 但是当我按月汇总时,数字似乎很高
    • 是的,我意识到我没有以正确的方式使用延迟。如果在客户 ID 的每个计划之前不存在计划,则尝试使用它以某种方式标记(使用空值)。
    猜你喜欢
    • 2021-10-22
    • 2018-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多