Как найти перекрывающиеся диапазоны дат из одних и тех же таблиц (многократное перекрытие) - PullRequest
0 голосов
/ 05 мая 2018

есть пользовательские данные с диапазоном данных data

Я пытаюсь обновить раздел флага с помощью запроса. Если одна и та же группа идентификаторов пользователей перекрывает какой-либо один диапазон дней, в секции флагов должно быть указано перекрытие.

Подскажите, пожалуйста, как пометить эти перекрывающиеся данные. Спасибо

Text file format:

ID UserID   registereddate  termdate    flag
1   abcd    1/1/2018    2/28/2018   overlapping with 2
2   abcd    1/1/2018    6/30/2018   overlapping with 1
3   abcd    8/1/2018    12/31/2018  
4   bbbb    5/1/2018    6/30/2018   overlapping with 5
5   bbbb    6/1/2018    7/30/2018   overlapping with 4
6   bbbb    9/1/2018    9/30/2018   
7   bbbb    10/1/2018   10/30/2018  
8   bbbb    11/1/2018   11/30/2018  
9   ccccc   7/1/2018    9/30/2018   overlapping with 10
10  ccccc   9/1/2018    12/31/2018  overlapping with 9
11  dddd    8/1/2018    8/31/2018   
12  dddd    12/1/2018   12/31/2018  
13  eeee    9/1/2018    12/31/2018  overlapping with 17
14  eeee    8/1/2018    8/31/2018   
15  eeee    9/1/2018    9/30/2018   overlapping with 15

Ответы [ 2 ]

0 голосов
/ 05 мая 2018

Вы можете также присоединить таблицу к себе и сравнить даты таким образом

SELECT * 
FROM [Table] t1
INNER JOIN [Table] t2 
ON  t1.ID <> t2.ID
AND t1.UserId = t2.UserId
AND ((t1.RegisterDate BETWEEN t2.RegisterDate AND t2.TermDate) OR (t1.TermDate BETWEEN t2.RegisterDate AND t2.TermDate))

Хотя чем больше у вас поля, тем сложнее становится

Смотрите это DBFiddle

0 голосов
/ 05 мая 2018

Чтобы получить 'overlapping', используйте exists:

select t.*,
       (case when exists (select 1
                          from t t2
                          where t2.registereddate < t.termdate and
                                t2.termdate > t.registereddate
                         )
             then 'overlaps'
        end)
from t;

В обновлении это выглядит так:

update t
    set flag = 'overlaps'
    where exists (select 1
                  from t t2
                  where t2.registereddate < t.termdate and
                        t2.termdate > t.registereddate
                 );

Получение списка перекрывающихся записей в строковом поле намного, намного сложнее в SQL Server. Получить парный список перекрытий довольно просто.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...