3

次の表を検討してください ( portfolio)。株式市場の投資家向けのトランザクション ログです。毎日、彼は株式 (によって識別される) をbuys、sells、またはholds (まだ売却されていない以前に購入した株)のいずれか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、知りたい: - ポートフォリオにまだ残っている銘柄 - これらの銘柄が最初に購入された価格と日付

これを手動で行う場合: - 株式11は で購入され2011-03-21、 で売却されました2011-03-22が、 で再び購入され、それ以来売却されていないため、まだポートフォリオにある2011-3-25- 株式は で購入および売却されているため、ポートフォリオには含まれていません -株式は買われており、保有していて売却したことはないため、まだ - 株の価格でポートフォリオにあり、以前に売買されています。8.902011-03-26552011-03-212011-03-22992011-03-212011-03-265.15122011-03-26

したがって、ポートフォリオは2011-03-26次のもので構成されます。

sp100_id  buy_date    buy_price
-------------------------------
11        2011-03-25  8.90
99        2011-03-21  5.15

私の質問は、上記の出力をテーブルから返すことができるクエリは何ですか?

ここで SQLFiddle

4

2 に答える 2

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
于 2012-08-31T10:29:04.557 に答える
2

ここにsqlfiddleのデモがあります

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)
于 2012-08-31T10:44:19.043 に答える