2016-04-24 28 views
0

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

回答

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; 
+0

我得到“缺少此功能的窗口规范”?它是否遗漏了过度声明?只是为了澄清,如果一个用户已经改变了一个计划4次,而第四次是溢价,我希望这个计数。玩了一下看起来像下面给我什么我想要的(溢价计划是非原创的) 选择*从 (选择c。*,lag(plan_id)over(order by plan_start_dte)作为prev_plan_id 从customer_histç )C WHERE prev_plan_id IS NOT NULL AND plan_id的数据类型=“溢价” 但是,当我在聚集通过这一个月的数字似乎很高 –

+0

是啊,我意识到我不使用滞后的正确途径。如果在客户ID的每个计划之前不存在计划,试图以某种方式标记(使用空值)。 –