Как запросить разрыв, чтобы узнать, что циклы дочерней таблицы покрывают весь период циклов родительской таблицы - PullRequest
0 голосов
/ 19 сентября 2019

У меня есть две таблицы для таблицы циклов договора с клиентом и таблицы циклов местоположения договора с клиентом.

Таблица циклов договора с клиентом (таблица PARENT1)

ID         Customer_ID     Contract_ID    START_DATE    END_DATE
5215436    128             569            2/1/2015      6/25/2017

Таблица циклов местоположения договора с клиентом (CHILD)Таблица 2)

ID          Customer_ID   Client_ID   LOCATION_ID CUSTOMER_CONTRACT_CYCLE_ID    START_DATE  END_DATE
37361952     128          284187      3477623       5215436                     2/1/2015    12/31/2016
112243088    128          284187      3477623       5215436                     1/1/2017    6/25/2017

Столбец идентификатора из таблицы 1 является внешним ключом в таблице 2, а столбец CUSTOMER_CONTRACT_CYCLE_ID - это

В моем примере существует два цикла местоположения контракта клиента для одного контракта клиента и дваЦиклы местоположения охватывают весь цикл контракта клиента для одного и того же (Customer_ID, Client_ID, LOCATION_ID, CUSTOMER_CONTRACT_CYCLE_ID).Между родительским и дочерним циклами нет разрыва, и несколько дочерних циклов охватывают весь цикл контрактов с клиентами.Но я хотел бы узнать те Циклы Местоположения Контракта с Клиентом, которые не полностью покрывают Цикл Контракта с Клиентом для данного (Customer_ID, Client_ID, LOCATION_ID, CUSTOMER_CONTRACT_CYCLE_ID).

Ответы [ 2 ]

0 голосов
/ 19 сентября 2019

Из опыта: если у вас есть такая возможность, переопределите end_date.В вашем примере end_date - 31 декабря, а следующее start_date - 1 января.Две разные даты, которые на самом деле означают одно и то же : не продолжался первый цикл размещения договора с клиентом вплоть до всего 31 декабря, поэтомувплоть до 1-го января?

При определении периодов с использованием start + end это значительно упрощает вычисления и фильтры, если вы определите end_date как сразу после фактический конец.Иногда используется запись [start_date, end_date[: end_date - это , а не , включенные в период.

Как только ваши данные настроены таким образом, вы можете просто сделать where previous.end_date = next.start_date.Это также позволяет вам использовать простые индексы (вместо индекса, основанного на функции end_date+1).

Альтернативой может быть изучение типа данных Interval .По определению он определяет отрезок времени: используйте start_date -поле и duration -поле вместо start_date, end_date.Вычитание дат, например next.start_date - previous.start_date, возвращает интервал, так что вы можете, например, фильтровать по next.start_date-previous.start_date <= prevous.duration.

Что я хочу научить вас, так это то, что моделирование ваших данных по-другому может впоследствии значительно упростить программирование,

0 голосов
/ 19 сентября 2019

Вам нужно искать четыре случая:

  • Для цикла вообще нет местоположений (в таблице расположений нет строк).
  • Отсутствует начальное местоположение цикла (сравнитеместоположение для начала цикла).
  • Отсутствует конечное местоположение для цикла (сравните местоположение с концом цикла).
  • Отсутствует среднее положение для цикла (сравнение между соседними местоположениями).

Следующий запрос ищет все четыре случая:

with 
s (id, start_date, end_date, ls, le, prev_end, next_start) as (
  select
    c.id,
    l.start_date, 
    l.end_date,
    lag(end_date) over(partition by c.id order by l.start_date),
    lead(start_date) over(partition by c.id order by l.start_date)
  from customer_contract_cycles c
  left join customer_contract_location_cycles l
            on c.id = l.customer_contract_cycle_id
)
select 'no locations at all for the cycle' as message, id, start_date, end_date
from s
where ls is null or le is null
union all

select 'no location at start of cycle', id, start_date, end_date
from s
where prev_end is null and le <> start_date
union all

select 'no location at end of cycle', id, start_date, end_date
from s
where next_start is null and le <> end_date
union all

select 'no location in middle of cycle', id, start_date, end_date
from s
where next_start is not null and next_start <> le + 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...