如何识别仅在之前的细分中发布超过6个月的最新细分?

时间:2018-05-08 20:09:29

标签: sql oracle oracle11g

我有一个程序资格数据集如下:


ID  PGM     DATE_EFF  DATE_END
1   P1      3/1/2018  4/30/2019
1   P2      1/1/2017  12/31/2017
2   P1      2/1/2018  12/31/2018
2   P2      1/1/2017  5/31/2017
3   P2      4/1/2018  3/31/2019
3   P1      1/1/2017  3/31/2017
3   P3      1/1/2016  12/31/2016

所以我只对ID(和行)感兴趣,其中DATE_EFF(生效日期)的程序介于2/1/2018和4/30/2018之间。在这些ID和行中,我只返回已识别的ID行,这些ID在“当前”资格的最后6个月内也没有任何其他程序资格(即“当前”意味着在2/1/2018和4/30之间落下/ 2018)。所以结果如下,其余的省略:


ID  PGM      DATE_EFF  DATE_END
2   P1       2/1/2018  12/31/2018
3   P2       4/1/2018  3/31/2019

未返回ID 1,因为虽然有一个程序在2/1/2018和4/30/2018(2014年3月1日)之间启动,但该ID在过去6个月内有另外一个资格,最终在12 /二千〇一十七分之三十一。 DATE_EFF和DATE_END是数字类型。帮助

2 个答案:

答案 0 :(得分:1)

看起来你想要这样的东西:

select * from myTable 
where ID not in 
(select ID 
 From myTable 
 where DATE_EFF not between '2018-03-01' and '2018-04-30'
 union
 select ID 
 From myTable 
 where date_end > add_months(sysdate, -6)

答案 1 :(得分:1)

您可以尝试通过外部联接将表连接到自身。尝试类似下面的查询:

select 
    current.*
from
    my_table current -- values to return
    left outer join my_table eligible -- IDs that were eligible in the past
        on (
                -- Join by ID
                current.id=eligible.id
                -- Only join rows eligible in the past 6 months
                and eligible.date_end > add_months(sysdate, -6) 
            )
where
    -- Get "current" rows
    current.DATE_EFF between TO_DATE('2/1/2018') and TO_DATE('4/30/2018') 
    -- And make sure this ID didn't have any eligible rows
    and eligible.id is null