我有三个表,每个表都有一个开始和结束日期。
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
答案 0 :(得分:1)
我认为这就是你想要的 - 至少根据你的样本数据提供你想要的输出:
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, '[]');