好的,我遇到了this相关问题,但与我的情况略有不同。
问题
我的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
条款,但我需要保留ids
tbl1
my_val2
,并且只需加入tbl2
的{{1}}。我需要在这里使用Postgres Window功能吗?有人可以建议如何加入这两个表吗?
答案 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;