【问题标题】:Intersecting dates postgres on joined tables maximum dates complex query连接表上的相交日期postgres最大日期复杂查询
【发布时间】:2018-06-06 15:37:02
【问题描述】:

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

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

我想要一个查询,该查询根据它们重叠的最大可能开始日期和它们重叠的最小可能结束日期列出相交表的行。我还需要第三张桌子的开始和结束日期。

表格需要通过某些值连接,例如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

【问题讨论】:

  • 两列连接的表是否名为valuetojoin?还是只有一列?如果这些是两列,最好使用专有名称而不是混淆它们超出可用性。表 3 是如何连接到其他表的?开始/结束日期应该是加入的一部分吗?你能提供一个简单的带有create tableinsert 语句的测试设置吗?
  • 两者都是。我已经更新了问题
  • table3 怎么样?那应该如何连接到其他表?
  • 仅按重叠的日期范围...
  • 而其他由连接列或连接列重叠日期范围?

标签: sql postgresql


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-16
    • 2015-07-17
    • 2019-03-03
    • 2018-02-26
    • 2018-01-20
    • 1970-01-01
    • 2011-06-08
    • 1970-01-01
    相关资源
    最近更新 更多