我尝试仅根据Eff_date和End_Date之间的日期选择那些数据不良的TN。我试图过滤掉坏数据。这就是我所拥有的:
TN EFF_DATE END_DATE
3097402606 12/4/2007 1/23/2011 23:59
3097402606 12/4/2007 12/31/2099
4054631308 6/15/2005 2/25/2008 23:59
4054631308 5/9/2008 7/14/2009 23:59
4054631308 5/9/2008 12/31/2099
5745378900 4/10/2012 5/21/2012 23:59
5745378900 2/4/2016 12/31/2099
7062329778 12/16/2008 10/27/2009 23:59
7062329778 10/28/2009 11/10/2009 23:59
7062329778 10/28/2009 12/31/2099
但我只需要选择这个BAD的数据。 EFF_DATE和END_DATE之间存在关系。
TN EFF_DATE END_DATE
4054631308 6/15/2005 2/25/2008 23:59
4054631308 5/9/2008 7/14/2009 23:59
**4054631308 5/9/2008 12/31/2099**
7062329778 12/16/2008 10/27/2009 23:59
7062329778 10/28/2009 11/10/2009 23:59
**7062329778 10/28/2009 12/31/2099**
正如你所看到的,EFF_DATE正在重复TNs。一旦END_DATE在7月14日确认为4054631308,EFF_DATE不能是5/9/2008,它可以是7/15/2009,也可能不需要在那里,但我需要展示的东西它给我的团队。 我只需要选择看起来像这样的数据,这样我就可以向团队解释我的过程。
我在Oracle SQL中尝试了不同的方法,但还没有成功。在此先感谢您的帮助
答案 0 :(得分:1)
对于时间段的重叠,您可以使用exists
:
select t.*
from t
where exists (select 1
from t t2
where t2.tn = t.tn and
t2.eff_date < t.end_date and
t2.end_date > t.eff_date
);
编辑:
哦,我明白了,你想要所有的TN行,而不仅仅是那些有重叠的行。在这种情况下,一种方法使用in
:
select t.*
from t
where t.tn in (select t.tn
from t
where exists (select 1
from t t2
where t2.tn = t.tn and
t2.eff_date < t.end_date and
t2.end_date > t.eff_date
);