- 定义参数变量
WITH date_param AS (
SELECT
'2024-09-01'::date AS start_date -- 入参日期,可以替换为具体的入参值
),
-- 计算每个组合月初到月末前一天的收益
MonthlyReturns AS (
SELECT
portfolio_id,
date_trunc('month', date) AS month,
SUM(daily_return) AS cumulative_return -- 累计收益
FROM
portfolio_returns
WHERE
date >= (SELECT start_date FROM date_param) - INTERVAL '6 months' -- 取入参日期半年内的数据
GROUP BY
portfolio_id, month
),
-- 计算每个组合月底的收益
EndOfMonthReturns AS (
SELECT
portfolio_id,
date AS end_of_month_date,
funds_change - (
SELECT
cumulative_return
FROM
MonthlyReturns
WHERE
MonthlyReturns.portfolio_id = EndOfMonthReturns.portfolio_id
AND month = date_trunc('month', EndOfMonthReturns.date)
) AS end_of_month_return
FROM
portfolio_returns
WHERE
date >= (SELECT start_date FROM date_param) - INTERVAL '6 months'
AND EXTRACT(DAY FROM date) = 1 -- 假设每月的第一天作为月底收益的计算日期
)
-- 选择最终结果
SELECT
COALESCE(D.portfolio_id, M.portfolio_id, E.portfolio_id) AS portfolio_id,
COALESCE(D.date, M.month, E.end_of_month_date) AS date,
COALESCE(D.daily_return, 0, E.end_of_month_return) AS total_return
FROM
DailyData D
FULL OUTER JOIN
MonthlyReturns M ON D.portfolio_id = M.portfolio_id AND D.date = M.month
FULL OUTER JOIN
EndOfMonthReturns E ON D.portfolio_id = E.portfolio_id AND D.date = E.end_of_month_date
WHERE
D.date >= (SELECT start_date FROM date_param) - INTERVAL '6 months'
OR M.month >= (SELECT start_date FROM date_param) - INTERVAL '6 months'
OR E.end_of_month_date >= (SELECT start_date FROM date_param) - INTERVAL '6 months'
ORDER BY
portfolio_id,
date;
字段详细注释:
WITH date_param AS (...): 定义一个临时表来存储入参日期,这里假设入参日期是 2024-09-01,你可以替换为具体的入参值。
MonthlyReturns: 计算每个组合从月初到月末前一天的累计收益。
date_trunc('month', date) AS month: 将日期截断到月初,用于标识每个月份。
SUM(daily_return) AS cumulative_return: 计算每个组合在每个月的累计收益。
EndOfMonthReturns: 计算每个组合月底的收益。
funds_change: 月底的资金变动。
cumulative_return: 月初到月末前一天的累计收益。
funds_change - cumulative_return AS end_of_month_return: 月底的收益是资金变动减去月初到月末前一天的累计收益。
COALESCE: 选择第一个非空值,用于处理不同数据源的收益计算。
FULL OUTER JOIN: 将三个结果集合并,确保包括所有组合和日期。
WHERE: 过滤条件确保只选择入参日期半年内的数据。
ORDER BY: 按组合ID和日期排序结果。
请注意,这个脚本假设 funds_change 字段包含了月底的资金变动,并且每月的第一天作为月底收益的计算日期。你可能需要根据你的实际数据和需求调整这个假设。
god831
- 粉丝: 0
- 资源: 39
最新资源
- QT实现升级进度条页面
- 基于Javascript的电影资讯微信小程序设计源码
- STM32F103C8T6+CUBEMX+0.96OLED
- Java-SpringBoot-vue基于微信小程序的在线点餐系统实现源码
- dlib-19.24.1-cp311-cp311-win-amd64.whl
- 最新-2023年 全国1-6批中国传统村落古村落统计数据Excel+shp.zip
- Java-SpringBoot-vue基于微信小程序的学生宿舍管理系统实现源码
- 基于PHP的电商购物平台设计源码
- Java-SpringBoot-vue基于微信小程序的考研知识题库练习系统实现源码
- 1991-2022年 重污染行业企业上市公司名单.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈