SQL: создание флага для отдельных записей в одной таблице с перекрывающимися диапазонами дат - PullRequest
0 голосов
/ 13 марта 2020

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

В следующем примере каждая уникальная комбинация Местоположение / Контрагент в указанном диапазоне дат ЛИБО может иметь контракт или DeliveryPoint, но не оба. Таким образом, идентификаторы 1 и 2 должны быть помечены, но идентификаторы 3 и 4 в порядке, потому что они не перекрываются, поэтому флаг должен выглядеть как «Ложь».

Я начал делать самостоятельное соединение, но после этого я не мог не оборачивай голову вокруг следующего шага. Правильно ли я начал, или решение совсем другое?

id  Location    Counterparty    Contract    DeliveryPoint     StartDate   EndDate
1   New York    Wal Mart                     Philadelphia     3/1/2019    12/31/2020
2   New York    Wal Mart        123456                        5/1/2019    7/31/2019
3   Toronto     Target                       Boston           3/1/2019    5/31/2019
4   Toronto     Target          456789                        6/1/2019    12/31/2020

С флагом я бы хотел, чтобы он выглядел как

id  Location    Counterparty    Contract    DeliveryPoint     StartDate  EndDate      Overlap
1   New York    Wal Mart                    Philadelphia      3/1/2019  12/31/2020    TRUE
2   New York    Wal Mart         123456                       5/1/2019  7/31/2019     TRUE
3   Toronto     Target                      Boston            3/1/2019  5/31/2019     FALSE
4   Toronto     Target           456789                       6/1/2019  12/31/2020    FALSE

1 Ответ

0 голосов
/ 13 марта 2020

По вашему запросу на вставку, я думаю, вы могли бы создать подзапрос, который будет искать другие записи с перекрывающимися датами. Обратите внимание на дату проверки поля. Смотрите пример:

insert into table(location, Counterparty, Overlap)
select
    @location, 
    @Counterparty, 
    case when exists(select Id
               from table t
               where t.location = @location
               and t.Counterparty = @Counterparty 
               and @startDate <= t.EndDate 
               and @endDate >= t.StartDate
              ) then 1 else 0 end as Overlap
...