我有一个程序资格数据集如下:
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是数字类型。帮助
答案 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