程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了计算累积产品价值大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决计算累积产品价值?

开发过程中遇到计算累积产品价值的问题如何解决?下面主要结合日常开发的经验,给出你关于计算累积产品价值的解决方法建议,希望对你解决计算累积产品价值有所启发或帮助;

我有以下数据库表:

Date        Return  Index
01-01-2020  0.1     Null 
01-02-2020  0.2     Null
01-03-2020  0.3     Null

我想使用以下公式更新索引值:

Index = (PrevIoUs_Month_Index * Return) + PrevIoUs_Month_Index (Use 100 for PrevIoUs_Month_Index for the first month)

预期结果:(按日期升序计算的索引)

Date        Return  Index
01-01-2020  0.1     110  -- (100 + 10)
01-02-2020  0.2     132  -- (110 + (110 * 0.20)) = 110 + 22 = 132
01-03-2020  0.3     171.6  -- (132 + (132 * 0.30)) = 132 + 39.6 = 171.6

如何使用 sql 执行此操作?我尝试了以下查询,但出现错误:

窗口函数不能在另一个窗口函数或聚合的上下文中使用。

--first,load the sample data to a temp table
SELEct *
into #t
from 
(
  values
  ('2020-01-01',0.10),('2020-02-01',0.20),('2020-03-01',0.30)
) d ([Date],[Return]);

--next,calculate cumulative product
SELEct *,CumFactor = cast(exp(sum(log(case when ROW_numbER() OVER(order by [Date] ASC)  = 1 then 100 * [Return] else [Return] end)) over (order by [Date])) as float) from #t;

drop table #t

解决方法

从数学上来说,你想要的结果相当于这个乘积:

100 * (1 + a1) * (1 + a2) * (1 + a3) * ....

其中 a1、a2、a3 是 [Return] 列的值。

该产品可以通过以下方式获得:

100 * EXP(SUM(LOG(1 + [Return])))

你可以在 sql 中这样做:

SELECT *,100 * EXP(SUM(LOG(1 + [Return])) OVER (ORDER BY [Date])) [Index]
FROM #t

参见demo。

,

递归 CTE 可能是最简单的方法:

with tt as (
      SELEct row_number() over (order by datE) as seqnum,date,ret
      from t
     ),cte as (
      SELEct seqnum,ret,convert(float,(1 + ret) * 100) as running@R_52_10586@l
      from tt
      where seqnum = 1
      union all
      SELEct tt.seqnum,tt.date,tt.ret,(1 + tt.ret) * cte.running@R_52_10586@l)
      from cte join
           tt
           on tt.seqnum = cte.seqnum + 1
     )
SELEct *
from cte;

Here 是一个 dbfiddle。

大佬总结

以上是大佬教程为你收集整理的计算累积产品价值全部内容,希望文章能够帮你解决计算累积产品价值所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。