一系列正负百分比的总百分比

时间:2018-08-10 16:23:28

标签: sql postgresql aggregate-functions percentage multiplication

Postgres 9.6.6,最新的Ubuntu LTS。
我有一列每日增长(+-)的百分比,例如:

Trader_Id   Date    8_AM    8_PM    Growth%
    1       1/1     290     248     -14,48
    1       2/1     225     880     291,11
    1       3/1     732     512     -30,05
    1       4/1     621     602      -3,06
    1       5/1     314     314        0,0
    1       6/1       0       0        0,0
    1       7/1     294     95      -67,69

对总和减去一系列百分比以获得所选交易者的总增长百分比(+-)的正确查询是什么?
在这种情况下,请选择一个Trader_Id,按日期ASC排序,然后从可用的第一天起计算总增长百分比。
这是手动计算的顺序

Growth%     Calculation                                     Result  
-14,48      1+(-14,48/100)                                  0,8552
291,11      0,8552+(291,11/100*0,8552)                      3,34477272
-30,05      3,34477272+(-30,05/100*3,34477272)              2,339668518
-3,06       2,33966851764+(-3,06/100*2,33966851764)         2,268074661
    0       2,26807466100022+(0/100*2,26807466100022)       2,268074661
    0       2,26807466100022+(0/100*2,26807466100022)       2,268074661
-67,69      2,26807466100022+(-67,69/100*2,26807466100022)  0,732814923
            (0,73281492296917-1)*100                        -26,7185077

SELECT SOMETHING(Growth% ORDER BY Date)的最终预期结果是 -26,72%

找出正确的公式可以做到这一点:

formula

现在剩下的问题是如何使用正确的SQL ...

2 个答案:

答案 0 :(得分:0)

我相信您有一列涉及日期的信息,并且您想知道当前一周的百分比总和。

你可以做

SELECT SUM(day_percent)
  FROM t
 WHERE calendar_day BETWEEN 
date_trunc('week',calendar_day) AND 
date_trunc('week',calendar_day) + INTERVAL '7 DAYS';

Demo

答案 1 :(得分:0)

由于缺乏信息,假设您的列growth的类型为numeric,并且您也希望numeric的计算精度。

(使用double precision进行计算比较便宜,但可能会增加舍入误差。)

创建一个汇总函数以一次生成一个序列产品

CREATE AGGREGATE numeric_mul(numeric) (
   sfunc = numeric_mul,
   stype = numeric
);

然后查询很简单:

SELECT 100 * numeric_mul(growth *.01 + 1) - 100
FROM   tbl;

db<>fiddle在这里

输入行的顺序与结果无关。

相关: