2017-09-05 42 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; 
相關問題