2014-09-01 2 views
0

나는 두 개의 테이블을 가지고 : (1) stock_Stock_purchase 테이블은 주식의 매매 기록을 담고있다; (2) 배당 표는 장기간에 걸쳐 많은 주식에 대해 선언 된 배당의 역사를 포함한다.PostgreSQL은 지난 날짜에 ​​가입

내 목표 : stock_purchase 테이블과 배당 테이블을 결합하고 주식이 배당 날짜로 보유 된 경우 배당 항목을 추가하십시오.

예제 테이블 : (1) stock_Stock_purchase 테이블 : 다른 날짜에 다른 주식을 매매 한 두 개의 계정.

account_name purchase_date ticker_symbol purchase_amount cum_shares_held 
john   02/27/2013  GOOG    500    50 
john   04/15/2013  GOOG    -250    40    
john   08/08/2013  GOOG    1000   150 
john   03/01/2013  FB    750    20 
john   04/15/2013  FB    -500    5 
john   09/15/2013  FB    1500    50 
bill   02/21/2013  GOOG    500    55 
bill   04/12/2013  GOOG    -250    43    
bill   08/29/2013  GOOG    1000   161 
bill   03/17/2013  FB    750    19 
bill   04/12/2013  FB    -500    7 
bill   09/27/2013  FB    1500    57 

이제 우리는 GOOG 및 FB에 대해 다음과 배당 내역 테이블이 있습니다. 배당금은 분기별로 신고됩니다.

ticker_symbol dividend_date  dividend_amount_per_share 
goog   12/31/2012  .04 
goog   03/31/2013  .04 
goog   06/30/2013  .03 
goog   09/30/2013  .09 
goog   12/31/2013  .05 
goog   03/31/2014  .04 
goog   06/30/2014  .03 
fb   12/31/2012  .44 
fb   03/31/2013  .19 
fb   06/30/2013  .23 
fb   09/30/2013  .25 
fb   12/31/2013  .39 
fb   03/30/2014  .99 
fb   06/30/2014  .79 

내가 왼쪽의 여러 조합을 시도했다/외부는에 삽입뿐만 아니라 조인하지만 내 결과는 내가 원하는 없습니다. 내가 좋은 시작이 될 것입니다 주식 테이블에서 추가 배당 기록을 얻을 수 있다면 최소한

. 다음 최고 기록은 다음과 같습니다. 첫 번째/마지막 구매 일 내에있는 배당 기록 만.

어떤 생각이나 아이디어가 있습니까? 시간과 노력에 감사드립니다.

+0

이러한 데이터에 대한 예상 결과 무엇입니까? – bereal

답변

2

SQL Fiddle

select distinct on (account_name, sp.ticker_symbol, dividend_date) 
    account_name as account, 
    sp.ticker_symbol as ticker, 
    cum_shares_held, 
    dividend_date, 
    dividend_amount_per_share as dividend_per_share, 
    dividend_amount_per_share * cum_shares_held as dividend_total 
from 
    stock_purchase sp 
    inner join 
    dividend_history dh on 
     lower(sp.ticker_symbol) = dh.ticker_symbol 
     and 
     sp.purchase_date <= dh.dividend_date 
order by account_name, sp.ticker_symbol, dividend_date, purchase_date desc 
; 
account | ticker | cum_shares_held | dividend_date | dividend_per_share | dividend_total 
---------+--------+-----------------+---------------+--------------------+---------------- 
bill | FB  |    19 | 2013-03-31 |    0.19 |   3.61 
bill | FB  |    7 | 2013-06-30 |    0.23 |   1.61 
bill | FB  |    57 | 2013-09-30 |    0.25 |   14.25 
bill | FB  |    57 | 2013-12-31 |    0.39 |   22.23 
bill | FB  |    57 | 2014-03-30 |    0.99 |   56.43 
bill | FB  |    57 | 2014-06-30 |    0.79 |   45.03 
bill | GOOG |    55 | 2013-03-31 |    0.04 |   2.20 
bill | GOOG |    43 | 2013-06-30 |    0.03 |   1.29 
bill | GOOG |    161 | 2013-09-30 |    0.09 |   14.49 
bill | GOOG |    161 | 2013-12-31 |    0.05 |   8.05 
bill | GOOG |    161 | 2014-03-31 |    0.04 |   6.44 
bill | GOOG |    161 | 2014-06-30 |    0.03 |   4.83 
john | FB  |    20 | 2013-03-31 |    0.19 |   3.80 
john | FB  |    5 | 2013-06-30 |    0.23 |   1.15 
john | FB  |    50 | 2013-09-30 |    0.25 |   12.50 
john | FB  |    50 | 2013-12-31 |    0.39 |   19.50 
john | FB  |    50 | 2014-03-30 |    0.99 |   49.50 
john | FB  |    50 | 2014-06-30 |    0.79 |   39.50 
john | GOOG |    50 | 2013-03-31 |    0.04 |   2.00 
john | GOOG |    40 | 2013-06-30 |    0.03 |   1.20 
john | GOOG |    150 | 2013-09-30 |    0.09 |   13.50 
john | GOOG |    150 | 2013-12-31 |    0.05 |   7.50 
john | GOOG |    150 | 2014-03-31 |    0.04 |   6.00 
john | GOOG |    150 | 2014-06-30 |    0.03 |   4.50