如何在SQL中计算指定固定参数下的有限级数累加和
你要实现的是首项为1、公比q=(1+r)/(1+W)的等比数列前k项求和,其中k=68-x,不需要编写循环逻辑,直接用等比数列求和公式即可实现,执行效率远高于循环方案。
方案1:等比数列公式实现(推荐)
等比数列求和公式为:S = (1 - q^k) / (1 - q),直接套入SQL即可:
固定r=0.2、W=0.4的场景
SELECT *, (1 - POWER(6.0/7, 68 - x)) / (1 - 6.0/7) AS 求和结果 FROM data WHERE x <= 68;
r、W从表字段动态取值的场景
SELECT *, (1 - POWER((1.0 + r)/(1.0 + W), 68 - x)) / (1 - (1.0 + r)/(1.0 + W)) AS 求和结果 FROM data WHERE x <= 68;
边界情况自动处理:当x=68时,68-x=0,
q^0=1,分子为1-1=0,求和结果为0,符合循环不执行的预期。
方案2:递归CTE实现(适用于需要逐行验证计算过程的场景)
如果确实需要模拟循环累加逻辑,可以用递归公用表表达式实现:
WITH RECURSIVE sum_calculation AS ( -- 初始项n=0 SELECT x, r, W, 0 AS n, CASE WHEN 68 - x <= 0 THEN 0.0 ELSE 1.0 END AS cumulative_sum FROM data WHERE x <= 68 UNION ALL -- 递归累加直到达到项数上限 SELECT x, r, W, n + 1 AS n, cumulative_sum + POWER((1.0 + r)/(1.0 + W), n + 1) AS cumulative_sum FROM sum_calculation WHERE n < 68 - x - 1 ) -- 取每个x对应的最终求和结果 SELECT x, r, W, cumulative_sum AS 求和结果 FROM sum_calculation QUALIFY ROW_NUMBER() OVER (PARTITION BY x ORDER BY n DESC) = 1;
上述写法支持大部分主流数据库(MySQL 8.0+、PostgreSQL、SQL Server、Spark SQL等),低版本数据库可自行调整为对应窗口函数写法。
内容的提问来源于stack exchange,提问作者Amby95
相关产品推荐
相关产品推荐

