PostgreSQL:如何基于相同的开始和结束时间(没有时区的时间戳)连接两个表?

时间:2017-09-05 19:59:13

标签: sql postgresql

好的,我遇到了this相关问题,但与我的情况略有不同。

问题

我的PostgreSQL 9.5数据库tbl1tbl2都有两个类似的表,都包含1,274 rowstable 1的结构和布局如下:

表1:

id (integer)   start_time           end_time              my_val1 (numeric)
51             1994-09-26 16:50:00  1994-10-29 13:30:00   3.7
52             1994-10-29 13:30:00  1994-11-27 12:30:00   2.4
53             1994-11-27 12:30:00  1994-12-29 09:25:00   7.6
54             1994-12-29 09:25:00  1994-12-31 23:59:59   2.9
54             1995-01-01 00:00:00  1995-02-05 13:50:00   2.9
55             1995-02-05 13:50:00  1995-03-12 11:10:00   1.6
56             1995-03-12 11:10:00  1995-04-11 09:05:00   2.2
171            1994-10-29 16:15:00  1994-11-27 19:10:00   6.9
172            1994-11-27 19:10:00  1994-12-29 11:40:00   4.2
173            1994-12-29 11:40:00  1994-12-31 23:59:59   6.7
173            1995-01-01 00:00:00  1995-02-05 15:30:00   6.7
174            1995-02-05 15:30:00  1995-03-12 09:45:00   3.2
175            1995-03-12 09:45:00  1995-04-11 11:30:00   1.2
176            1995-04-11 11:30:00  1995-05-11 15:30:00   2.7
321            1994-09-26 14:40:00  1994-10-30 14:30:00   0.2
322            1994-10-30 14:30:00  1994-11-27 14:45:00   7.8
323            1994-11-27 14:45:00  1994-12-29 14:20:00   4.6
324            1994-12-29 14:20:00  1994-12-31 23:59:59   4.1
324            1995-01-01 00:00:00  1995-02-05 14:35:00   4.1
325            1995-02-05 14:35:00  1995-03-12 11:30:00   8.2
326            1995-03-12 11:30:00  1995-04-11 09:45:00   1.2
.....

在某些行中,start_timeend_time可能看起来相似,但整个时间窗口可能不相等。例如,

 id (integer)   start_time          end_time              my_val1 (numeric)
 54             1994-12-29 09:25:00 1994-12-31 23:59:59   2.9
 173            1994-12-29 11:40:00 1994-12-31 23:59:59   6.7

Start_timeend_timetimestamp without time zonestart_timeend_time必须在一年的时间内,因此只要年份从1994更改为1995,那么该行就会分成两行,因此,那里正在重复id列中的ID。表2 tbl2包含类似的start_timeend_timetimestamp without time zone)和列my_val2numeric)。对于table 1中的每一行,我需要加入table 2的相应行,其中start_timeend_time相似。

我尝试了什么,

Select 
    a.id,
    a.start_time, a.end_time,
    a.my_val1,
    b.my_val2
from tbl1 a
left join tbl2 b on 
b.start_time = a.start_time
order by a.id;

查询返回了3,802行,这是不需要的。所需的结果是与table 1加入的1,274行my_val2。我知道Postgres Distinct on条款,但我需要保留ids tbl1 my_val2,并且只需加入tbl2的{​​{1}}。我需要在这里使用Postgres Window功能吗?有人可以建议如何加入这两个表吗?

2 个答案:

答案 0 :(得分:0)

为什么你没有在ON部分添加条件

ON b.start_time = a.start_time AND a.id = b.id

答案 1 :(得分:0)

  

对于表1中的每一行,我需要加入表2的相应行   其中start_time和end_time相似。

SQL查询应该包含end_time

SELECT a.id,
       a.start_time, 
       a.end_time,
       a.my_val1,
       b.my_val2
  FROM tbl1 a
  LEFT JOIN tbl2 b 
    ON b.start_time = a.start_time
   AND b.end_time = a.end_time
 ORDER BY a.id;