【问题标题】:PostgreSQL join on last datePostgreSQL 加入最后日期
【发布时间】:2014-09-02 02:09:33
【问题描述】:

我有两个表: (1) stock_purchase 表包含股票买卖的历史; (2) 股息表包含许多股票在较长时间范围内宣布的股息历史。

我的目标:结合 stock_purchase 和股息表,如果在股息日期持有股票,则添加一个股息条目。

示例表: (1) 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

我尝试了几种左/外连接组合以及插入,但我的结果不是我想要的。

至少,如果我能在股票表中获得额外的股息记录,那将是一个好的开始。 下一个最佳选择是:仅在我的第一次/最后一次购买日期内的那些股息记录。

有什么想法或想法吗?感谢您的任何时间和努力。

【问题讨论】:

  • 这些数据的预期结果是什么?

标签: postgresql join


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2019-08-16
    • 1970-01-01
    • 1970-01-01
    • 2019-09-18
    • 1970-01-01
    • 2016-08-10
    • 1970-01-01
    • 1970-01-01
    • 2015-08-27
    相关资源
    最近更新 更多