繁体   English   中英

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

[英]PostgreSQL: How do I join two tables based on same start and end time (timestamp without time zone)?

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

问题

我的PostgreSQL 9.5数据库tbl1tbl2有两个类似的表,都包含1,274 rows table 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 zone start_timeend_time必须在一年的窗口中,因此,从19941995的任何年份发生变化时,该行都会分为两行,因此,列id有重复的ID。 表2 tbl2包含相似的start_timeend_timetimestamp without time zone )和my_val2列( numeric )。 对于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子句,但是我需要保留tbl1所有重复ids ,并且只需要加入my_val2tbl2 我需要在这里使用Postgres Window函数吗? 有人可以建议如何加入这两个表吗?

为什么不将条件添加到ON部分

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

对于表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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM