2016-05-24 2 views
0

Я пытаюсь выбрать только те TN, у которых плохие данные, основанные на датах между Eff_date и End_Date. Я пытаюсь отфильтровать плохие данные. Это то, что у меня есть:Дата перекрытия Oracle SQL

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 

Но мне нужно выбрать только эти данные, которые НЕОБХОДИМО. Существует связь между 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 повторяет себя для TN. После подтверждения END_DATE 7/14/2009 для 4054631308 EFF_DATE не может быть 5/9/2008, либо он может быть 7/15/2009, либо он не обязательно должен быть там, но что-то, что мне нужно показать это моей команде. Мне просто нужно выбрать данные, которые выглядят так, чтобы я мог объяснить мой процесс, хотя процесс был для команды.

Я пробовал разные способы в Oracle SQL, но пока ничего не добился. Заранее спасибо за помощь

+0

Что вы подразумеваете под «имеет дату перекрытия между' 'eff_date' и end_date'»? Не могли бы вы [изменить] ваш вопрос и включить некоторые подробности? –

+1

Можете ли вы снова объяснить правило - почему некоторые строки выбраны, а некоторые нет? Вы сказали: «У меня есть совпадение даты между eff_date и end_date» - что это значит? Посмотрите на свой «желаемый результат» - что накладывается на даты с ПЕРВОЙ ROW и что-то еще? Кроме того, из входных данных первые две строки показывают перекрытие, но вы не выбираете их - почему? – mathguy

+0

Хотя я еще не совсем понимаю ваш вопрос, я чувствую, что результат будет включать аналитические функции 'LEAD' и' LAG', разбиение на 'tn'. –

ответ

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 
      ); 

EDIT:

О, я вижу, вы хотите, чтобы все Т.Н. строки, а не только те, с перекрытия. В этом случае один метод использует 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 
       ); 
+0

выберите т. * из т , где t.tn в (выбрать t.tn из т , где существует (выберите 1 из трет t2 где t2.tn = t.tn и t2.eff_date t.eff_date ), и tn in ('3097402606') , когда я помещаю это хорошее TN, он все еще появляется, я ожидал возвращения ничего, но он все равно дал мне строки. –

+0

select t. * от t где t.tn in (выберите t.tn от t где существует (выберите 1 от t t2 где t2.tn = t.tn и t2.eff_date t.eff_date ); и tn in ('5745378900') , когда я положил этот хороший TN, он все еще появляется, я ожидал возвращения ничего, но он все равно дал мне строки. –

Смежные вопросы