一系列正负百分比的总百分比
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';
由于缺乏信息假设您的列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
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';
由于缺乏信息假设您的列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