我目前使用以下代码在两个月内生成用户的“monthly_return”。如何将“monthly_return”转换为类似于下面链接的StackOverflow问题的累积“链接”返回?
类似的问题:Running cumulative return in sql
我试过了:
exp(sum(log(1 + cumulative_return) over (order by date)) - 1)
但是得到错误:
PG :: WrongObjectType:ERROR:OVER指定,但是log不是窗口函数,也不是聚合函数LINE 3:exp(sum(log(1 + cumulative_return)over(order by date)) - 1 ... ^ :SELECT portfolio_id,exp(sum(log(1 + cumulative_return)over(按日期排序)) - 1)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 cumulative_return FROM portfolio_balances WHERE portfolio_id = 16 ORDER BY portfolio_id,date)as return_data;
输入数据为:
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)
如果您想要累积总和:
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;
我没有看到这很有意义,因为你有一个比例的累积总和,但这似乎是你所要求的。