Обнаружение нескольких совпадений за промежуток времени в SQL Oracle - PullRequest
0 голосов
/ 05 июля 2019

У меня есть таблица, которая соответствует ID1 - ID2, с двумя столбцами даты, которые определяют интервал времени, в течение которого совпадение действительно. Для каждого ID1 может быть несколько ID2, , но не за один и тот же интервал времени . Однако из-за ошибок в вменении данных эти случаи существуют в таблице. Я должен их идентифицировать.

Пример: последние две записи в этой таблице имеют эту проблему: в период с 2005 по 2015 год ID1 44 соответствует двум разным номерам ID2, 22 и 55.

ID1     ID2     startdate      enddate
 11      22     2000-01-01  2010-01-01  
 11      33     2010-01-01  9999-01-01  
 44      22     2000-01-01  2010-01-01  
 44      22     2010-01-01  9999-01-01  
 44      55     2005-01-01  2015-01-01  

Для начала было бы достаточно иметь список отдельных ID1, имеющих эту проблему; было бы еще лучше, если бы я мог также идентифицировать все записи, которые конфликтуют с ограничением.

Предложения по наиболее элегантному способу сделать это в Oracle SQL?

Ответы [ 2 ]

2 голосов
/ 05 июля 2019

Вы можете использовать exists:

select t.*
from t
where exists (select 1
              from t t2
              where t2.id1 = t.id1 and t2.id2 <> t.id2 and
                    t2.startdate < t.enddate and
                    t2.enddate > t.startdate
             )
order by t.id1, t.startdate;
1 голос
/ 05 июля 2019

С существует:

select t.*
from tablename t
where exists (
  select 1 from tablename
  where (id1 = t.id1 and id2 <> t.id2) 
    and (
      startdate between t.startdate and t.enddate 
      or
      enddate between t.startdate and t.enddate
      or
      t.startdate between startdate and enddate 
      or
      t.enddate between startdate and enddate
    )   
)
...