在连接表格上交叉日期postgres最大日期复杂查询

时间:2018-06-06 07:09:26

标签: sql postgresql

我有三个表,每个表都有一个开始和结束日期。

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 :(得分: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, '[]');

在线示例:http://rextester.com/HBFY75494