2017-08-14 21 views
0

私は現在、以下のコードを使用して2か月間にユーザーの "monthly_return"を生成しています。私は "monthly_return"を以下にリンクされたStackOverflowの質問と同様の累積的な "リンクされた"リターンにする方法はありますか?SQLを使用した累積累積リターン

同様の質問:Running cumulative return in sql

私が試した:

exp(sum(log(1 + cumulative_return) over (order by date)) - 1) 

しかし、エラーが表示されます。

PG :: WrongObjectType:ERROR:指定されたが、ログOVERは、ウィンドウ関数でもありません集計関数LINE 3:exp(sum(log(1 + cumulative_return)を超える日付順) - 1 ... ^:SELECT portfolio_id、exp(log(1 + cumulative_return) 1)FROM(日付選択、portfolio_id、(value_cents * 0.01 - cash_flow_cents * 0.01)/(ポートフォリオに含まれているポートフォリオのうち、ポートフォリオに含まれるポートフォリオのポートフォリオに含まれるポートフォリオのポートフォリオを特定する。

入力データは次のようになります

1/1/2017: $100 value, $100 cash flow 
1/2/2017: $100 value, $0 cash flow 
1/3/2017: $100 value, $0 cash flow 
1/4/2017: $200 value, $100 cash flow 

出力は次のようになります(累積)リンクされていない毎月のリターンを示す

1/1/2017: 0% cumulative return 
1/2/2017: 0% cumulative return 
1/3/2017: 0% cumulative return 
1/4/2017: 0% cumulative return 

私の現在のコード。

SELECT 
date, 
portfolio_id, 
(value_cents * 0.01 - cash_flow_cents * 0.01)/(lag(value_cents * 0.01, 1) over (ORDER BY portfolio_id, date)) - 1 AS monthly_return 
FROM portfolio_balances 
WHERE portfolio_id = 16 
ORDER BY portfolio_id, date; 
+0

ご使用のデータベースで質問にタグを付けてください。 –

+0

@GordonLinoff - ありがとう、Postgres! –

+0

は、いくつかのサンプルデータと予想される出力を示します。 –

答えて

0

あなたが累積合計したい場合:

SELECT p.*, 
     SUM(monthly_return) OVER (PARTITION BY portfolio_id ORDER BY date) as running_monthly_return 
FROM (SELECT date, portfolio_id, 
       (value_cents * 0.01 - cash_flow_cents * 0.01)/(lag(value_cents * 0.01, 1) over (ORDER BY portfolio_id, date)) - 1 AS monthly_return 
     FROM portfolio_balances 
     WHERE portfolio_id = 16 
    ) p 
ORDER BY portfolio_id, date; 

を使用すると、比率の累積和を持っているので、私は、これは非常に理にかなっていることがわかりませんが、それはあなたが何であるかのように見えますを求めて。

+0

合計を取るのではなく、値を一緒に乗算するのはどうですか? –