2014-07-20 1 views
0

동일한 테이블에서 외부 조인을 수행하려고하지만 예기치 않은 결과가 발생합니다. BID는, ASK 또는 거래 될 수PostgreSQL : 외부 및 자체 조인

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_timestamp, security, bid price (price_type = 'BID'인 가까운 가격이 될 것입니다) 및 trade price (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' 

이 19,370 레코드를 반환합니다. 40147 건의 입찰가와 19399 건의 거래 가격이 있으므로 적어도 최대 (40147, 19399) = 40147 건의 기록을 기대합니다. 한눈에 그것은 INNER JOIN을 반환하는 것 같습니다.

또한 ON cluse의 "b.security = t.security"를 WHERE 절로 옮겨 보았습니다.

+1

비록 당신이 무엇을하려하는지 완전히 이해하지 못하지만, 전체 외부 조인을 사용하고 싶지는 않습니다. 단지 t의 행에 대해 b에없는 행이 있다면, 그 쿼리에서 반환 된 값은 '무역'열입니다.이 열은 겉으로는 아무 것도 전달하지 못했을 것이라고 생각합니다. 몇 행의 데이터와 해당 행을 기반으로 한 예상 결과를 게시 할 수 있습니까? (예) –

+0

예 (예를 들어) 물음에 데이터가 누락되어 있기 때문에 전체 외부 조인을 원했기 때문에 행을 생략하지 않았습니다. –

답변

3

where 절에서 별칭 'b'가 모두 & 't'이므로 참조 레코드가 줄어들고 있습니다.

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.price_type = 'BID'와 t.price_type = '무역'

이 (가) 예를 들어

합류로 어디 조건을 이동하려고 만 가입 기록을 필터링한다

이것은 b.price_type = 'BID'인 별명 'b'와 별명 't'의 적어도 하나의 레코드에서 모든 레코드를 리턴합니다. 't'에서 일치하는 레코드가 없으면 널 (null) 레코드가 리턴됩니다.

+0

완벽한, 감사합니다! –