You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在PostgreSQL中基于每日涨跌幅计算累计价值(初始值100)

问题描述

我有一张名为performance的表,结构及数据如下:

datepercent_change
2022/12/012
2022/12/02-1
2022/12/033

假设初始价值为100,需要编写PostgreSQL查询语句,计算截至每日的累计价值,期望输出如下:

datepercent_changecumulative value
2022/12/012102
2022/12/02-1100.98
2022/12/033104.0094
解决方案

可以通过对数与指数转换实现累积乘积,结合窗口函数计算每日累计价值,对应的PostgreSQL查询语句如下:

SELECT
    date,
    percent_change,
    ROUND(100 * EXP(SUM(LN(1 + percent_change::numeric / 100)) OVER (ORDER BY date)), 4) AS cumulative_value
FROM performance
ORDER BY date;

逻辑说明

  1. 转换变化率为乘数:将百分比变化转换为价值乘数,公式为1 + percent_change::numeric / 100,例如2%对应1.02,-1%对应0.99。
  2. 实现累积乘积:PostgreSQL没有原生的累积乘积窗口函数,通过LN()取自然对数将乘法转为加法,用SUM() OVER (ORDER BY date)计算对数的累积和,最后用EXP()还原为乘积。
  3. 计算最终价值:将累积乘积乘以初始值100,用ROUND()保留4位小数以匹配期望输出格式。

执行该查询后,输出结果与需求完全一致。

内容的提问来源于stack exchange,提问作者shyam yadav

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 01:30:31