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

Total percentage of a series of positive and negative percentages

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

对一系列百分比求和和减去以获得 selected 交易者的总增长百分比 (+-) 的正确查询是什么?
在这种情况下,select a 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%

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

现在剩下的问题就是如何正确翻译SQL...

我相信您有一个列涉及当天,并且您想知道本周的百分比总和。

你可以

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

由于缺乏信息假设您的列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 这里

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

相关:

  • Product Aggregate in PostgreSQL