2012-08-31 2 views
3

다음 표 (portfolio)를 고려하십시오. 주식 시장 투자자를위한 거래 로그입니다. 매일 그 중 하나 buy의, sell의 또는 hold의 (아직 판매되지 않는 이전에 구입 한 주식) (sp100_id로 식별) 주식 :어떤 주식이 매수되었지만 아직 판매되지 않았는지 데이터베이스에서 읽는 방법은 무엇입니까?

_date  sp100_id action price 
----------------------------------- 
2011-03-21 11  buy  10.50 
2011-03-21 55  buy  60.00 
2011-03-21 99  buy  5.15 
2011-03-22 11  sell  9.80 
2011-03-22 55  sell 61.50 
2011-03-22 99  hold  5.60 
2011-03-23 1  buy  95.00 
2011-03-23 2  buy  25.60 
2011-03-23 99  hold 
2011-03-24 1  sell 96.00 
2011-03-24 2  hold 
2011-03-24 99  hold 
2011-03-25 11  buy  8.90 
2011-03-25 2  sell 28.00 
2011-03-25 99  hold 

로그가 2011-03-25에서 멈 춥니 다. 이 주식이 무엇인지 가격에 어떤 날짜에 우리가이 수동으로 할 경우, 원래는

를 구입 - 어떤 주식이 여전히 포트폴리오 에 남아 있습니다 - 을 : 2011-03-26를 들어, 내가 알고 싶은 - 재고 112011-03-21에서 구입한다 , 2011-03-22에 판매하지만, 8.90에 대한 2011-3-25 다시 구입하고 우리는 이후 판매하지 않은, 그래서 2011-03-26 에 포트폴리오에 여전히 - 재고 552011-03-21에서 구입 그래서 더 이상은 포트폴리오에 2011-03-22에 판매 - 재고 992011-03-21에서 구입합니다.

sp100_id buy_date buy_price 
------------------------------- 
11  2011-03-25 8.90 
99  2011-03-21 5.15 
: 재고 12011-03-26

그래서 2011-03-26의 포트폴리오 구성하기 전에 2 모두 구입 및 판매 - 그것은 5.15 의 가격 2011-03-26에 포트폴리오에 여전히 있도록 D 우리는 그것을 보유하고 판매 적이 없다

제 질문은 : 위의 결과를 테이블에서 반환 할 수있는 쿼리는 무엇입니까?

SQLFiddle here

답변

2
select t1.sp100_id, t1._date as buy_date, t1.price 
from (select * from portfolio where action='buy') t1 
    left join (select * from portfolio where action='sell') t2 
     on t1.sp100_id=t2.sp100_id 
    and t1._date<t2._date 
where t2.sp100_id is null 
+1

일이 참으로 깨끗한 :-) 감사하는 스마트하고 깨끗한 방법 – InSane

+0

이잖아입니다! – Pr0no

2

는 여기 sqlfiddle demo

select t0.* from portfolio t0 
join 
(
select sp100_id,max(_date) mdate from portfolio t 
    where action = 'buy' 
     and 
     not exists (select sp100_id from portfolio t2 
        where t2.sp100_id=t.sp100_id 
          and t2._date>t._date 
          and t2.action='sell') 
group by sp100_id 
) t1 on (t0.sp100_id=t1.sp100_id) and (t0._date=t1.mdate) 
관련 문제