[英]PostgreSQL: How do I join two tables based on same start and end time (timestamp without time zone)?
好的,我遇到了这个相关问题,但与我的情况略有不同。
问题
我的PostgreSQL 9.5数据库tbl1
和tbl2
有两个类似的表,都包含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_time
和end_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_time
和end_time
是timestamp without time zone
。 start_time
和end_time
必须在一年的窗口中,因此,从1994
到1995
的任何年份发生变化时,该行都会分为两行,因此,列id
有重复的ID。 表2 tbl2
包含相似的start_time
和end_time
( timestamp without time zone
)和my_val2
列( numeric
)。 对于table 1
每一行,我需要加入table 2
对应行,其中start_time
和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
order by a.id;
该查询返回了3,802
行,这是不希望的。 期望的结果是将table 1
1,274行与my_val2
联接在一起。 我知道Postgres Distinct on
子句,但是我需要保留tbl1
所有重复ids
,并且只需要加入my_val2
的tbl2
。 我需要在这里使用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.