簡體   English   中英

PostgreSQL:外部和自我連接

[英]PostgreSQL: Outer and self join

我想在同一張桌子上做一個外部聯接,但是得到了意外的結果。

這是我的“股票”表的樣子:

price_timestamp,            security,   price_type, open,  high, low,  close
"2014-05-01 00:00:00-07";"SPY US EQUITY";"ASK";     188.54;188. 57;188.54;188.57
"2014-05-01 07:59:00-07";"SPY US EQUITY";"ASK";     188.72;188. 72;188.72;188.72
"2014-05-01 08:01:00-07";"SPY US EQUITY";"ASK";     188.71;188. 72;188.71;188.72
"2014-05-01 13:30:00-07";"SPY US EQUITY";"TRADE";   188.22;188. 27;188.21;188.26
"2014-05-01 13:31:00-07";"SPY US EQUITY";"TRADE";   188.27;188. 35;188.26;188.35
...

price_type可以是BID,ASK或TRADE。 我想要一個查詢,該查詢返回price_timestamp,安全性,買入價(在price_type ='BID'時為收盤價)和交易價格(在price_type ='TRADE時為收盤價)。

這就是我所擁有的:

SELECT b.price_timestamp, b.security, b.close AS bid, t.close AS trade
  FROM stock b
  FULL OUTER JOIN stock t
    ON b.price_timestamp = t.price_timestamp
   AND b.security = t.security
 WHERE b.price_type = 'BID'
   AND t.price_type = 'TRADE'

這將返回19370條記錄。 有40147個買入價,19399個交易價,所以我希望至少有max(40147,19399)= 40147條記錄。 乍一看,它似乎正在返回INNER JOIN。

我還嘗試過將ON子句中的“ b.security = t.security”移到WHERE子句-運氣不好。

您得到的記錄更少,因為在where子句中您同時引用了兩個別名“ b”和“ t”。 因此,它僅過濾b.price_type ='BID'和t.price_type ='TRADE'的那些聯接記錄。

嘗試將where條件移動到聯接中

例如:

SELECT b.price_timestamp, b.security, b.close AS bid, t.close AS trade
  FROM stock b
  FULL OUTER JOIN stock t
    ON b.price_timestamp = t.price_timestamp
   AND b.security = t.security
   AND t.price_type = 'TRADE'
 WHERE b.price_type = 'BID'

這將從別名“ b”(其中b.price_type =“ BID”)返回所有記錄,並至少返回別名“ t”的一條記錄。 如果從“ t”中找不到匹配的記錄,則將返回空記錄。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM