Пересекающиеся даты postgres на соединенных таблицах максимальный срок сложных запросов - PullRequest
0 голосов
/ 06 июня 2018

У меня есть три таблицы, каждая из которых имеет дату начала и окончания.

e.g. 
Table 1
start_date | end_date | valueToJoin1 | ValueToJoin2 | fruit
 2000-01-01  2000-02-01    XXXX           YYYY       apple
 2000-01-01  2000-02-01    XXXX           BBBB       apple

Table 2
start_date | end_date | valueToJoin1 | ValueToJoin2 | vegetable
2000-01-15    2000-12-31    XXXX          YYYY        tomato

Table 3
start_date | end_date | car 
2000-01-05    2000-10-31   porsche
2000-02-02    2000-10-31   mazda

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

Таблицы должны быть объединены определенными значениями, например, XXXX должен совпадать в обеих таблицах.

Мне также не нужны дубликаты илиненужная информацияВывод для вышеупомянутого должен быть только в одной строке:

 max_start_date | max_end_date | table_3_start_date | table_3_end_date |  joinedValue1 | joinedValue2 | vegetable | fruit | car
  2000-01-15       2000-02-01        2000-01-05         2000-10-31      XXXX          YYYY        tomato    apple   porsche

1 Ответ

0 голосов
/ 06 июня 2018

I думаю, это то, что вы хотите - по крайней мере, он дает желаемый результат на основе ваших выборочных данных:

select greatest(tb1.start_date, tb2.start_date, tb3.start_date) as max_start_date,  
       least(tb1.end_date, tb2.end_date, tb3.end_date) as max_end_date, 
       tb3.start_date as tb3_start_date, 
       tb3.end_date as tb3_end_date,
       tb1.j1, 
       tb1.j2,
       tb1.fruit,
       tb2.vegetable,
       tb3.car
from tb1 
  join tb2 
    on (tb2.j1, tb2.j2) = (tb1.j1, tb1.j2) 
   and daterange(tb2.start_date, tb2.end_date, '[]') && daterange(tb1.start_date, tb1.end_date, '[]')
  join tb3 
    on daterange(tb3.start_date, tb3.end_date, '[]') && daterange(tb1.start_date, tb1.end_date, '[]')
   and daterange(tb3.start_date, tb3.end_date, '[]') && daterange(tb2.start_date, tb2.end_date, '[]');

Онлайн пример: http://rextester.com/HBFY75494

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