2017-09-05 41 views
1

好的,我碰到this有关的问题,但它与我的情况稍有不同。PostgreSQL:如何基于相同的开始和结束时间(不带时区的时间戳)加入两个表?

问题

我有两个同类型的表在我的PostgreSQL数据库9.5和tbl1tbl21,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 zonestart_timeend_time必须在一年窗口中,因此每当年份从19941995发生变化时,那么该行被分成两行,因此在列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行。期望的结果是1274行table 1加入my_val2。我知道Postgres Distinct on子句,但我需要保留所有重复idstbl1,并且只需要加入tbl2my_val2。我需要在这里使用Postgres Window功能吗?有人可以建议如何加入这两张表吗?

+1

如果开始和结束时间在tbl2的和TBL 1相似,你应加入START_TIME和END_TIME? tbl1.start和tbl2.start的时间又有多相似?是否等于给出期望的结果,还是应该对时间进行一些舍入? – WJS

+0

我试过了:b.start_time = a.start_time AND b.end_time = a.end_time,但查询返回了一些空行。问题是ID仅存在于table_1中。在表2中,start_time和end_time窗口可能相同,但它们与table_1的顺序不同。 –

+0

对两个表中的start_time和end_time执行不同的结果返回1,187行。因此,开始和结束时间不像ID一样是唯一的。我不确定四舍五入将有助于或给出预期的结果。我无法在这里显示所有的start和end_time行。 –

回答

0

你为什么不加入到ON部分条件

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

谢谢。但是,ID列只存在于table_1中。 –

+0

您的表格上没有主键,也没有主键,所以您如何知道哪些行相互连接? –

+0

如上所述,start_time和end_time窗口是相同的,但可能不是相同的顺序。我驾驶室创建object_id作为一个新的主键列,但我不知道连接会给出所需的结果。 –

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; 
相关问题