Sql 根据每日百分位值计算每月百分位值
我在Sql 根据每日百分位值计算每月百分位值,sql,postgresql,aggregate,percentile,Sql,Postgresql,Aggregate,Percentile,我在postgres数据库中有一个表,其表示形式如下: date name percentile95 2018-09-01 a 0.34 2018-09-02 a 0.41 .... 2018-09-29 a 0.74 2018-09-30 a 0.39 2018-10-01 a 0.31 2018-10-02 a 0.
postgres
数据库中有一个表,其表示形式如下:
date name percentile95
2018-09-01 a 0.34
2018-09-02 a 0.41
....
2018-09-29 a 0.74
2018-09-30 a 0.39
2018-10-01 a 0.31
2018-10-02 a 0.24
....
2018-10-30 a 0.64
2018-09-31 a 0.89
我每天都有与特定名称“a”对应的百分位数95值。我想计算的是这些每日值的每月百分位值,因此结果如下所示:
date name percentile95
2018-09-01 a {aggreate_percentile from sept}
2018-10-01 a {aggreate_percentile from oct}
在SQL中有什么方法可以做到这一点吗
编辑:根据这一点,不可能计算总百分位数。因此,首先,是否可以从每日百分位数计算每月百分位数?您可以尝试使用
date\u part
函数获取年和月,然后在子查询中进行求和,然后在月和年上进行自联接并进行一些计算
CREATE TABLE T(
date timestamp,
name varchar(50),
percentile95 float
);
insert into T values ('2018-09-01','a',0.34);
insert into T values ('2018-09-02','a',0.41);
insert into T values ('2018-09-29','a',0.74);
insert into T values ('2018-09-30','a',0.39);
insert into T values ('2018-10-01','a',0.31);
insert into T values ('2018-10-02','a',0.24);
insert into T values ('2018-10-30','a',0.64);
insert into T values ('2018-09-30','a',0.89);
查询1:
select
date,
t1.name,
concat((percentile95 * 100/total ),'%') percentile95
from T t1 JOIN (
SELECT
date_part('year', date) y,
date_part('month', date) m,
name,
sum(percentile95) total
FROM T
group by date_part('year', date),
date_part('month', date),
name
) v
ON
v.y = date_part('year', t1.date)
and
v.m = date_part('month', t1.date)
and
v.name = t1.name
| date | name | percentile95 |
|----------------------|------|----------------------|
| 2018-09-01T00:00:00Z | a | 12.2743682310469318% |
| 2018-09-02T00:00:00Z | a | 14.8014440433213004% |
| 2018-09-29T00:00:00Z | a | 26.7148014440433208% |
| 2018-09-30T00:00:00Z | a | 14.0794223826714795% |
| 2018-09-30T00:00:00Z | a | 32.1299638989169694% |
| 2018-10-02T00:00:00Z | a | 20.1680672268907557% |
| 2018-10-30T00:00:00Z | a | 53.7815126050420176% |
| 2018-10-01T00:00:00Z | a | 26.0504201680672267% |
:
select
date,
t1.name,
concat((percentile95 * 100/total ),'%') percentile95
from T t1 JOIN (
SELECT
date_part('year', date) y,
date_part('month', date) m,
name,
sum(percentile95) total
FROM T
group by date_part('year', date),
date_part('month', date),
name
) v
ON
v.y = date_part('year', t1.date)
and
v.m = date_part('month', t1.date)
and
v.name = t1.name
| date | name | percentile95 |
|----------------------|------|----------------------|
| 2018-09-01T00:00:00Z | a | 12.2743682310469318% |
| 2018-09-02T00:00:00Z | a | 14.8014440433213004% |
| 2018-09-29T00:00:00Z | a | 26.7148014440433208% |
| 2018-09-30T00:00:00Z | a | 14.0794223826714795% |
| 2018-09-30T00:00:00Z | a | 32.1299638989169694% |
| 2018-10-02T00:00:00Z | a | 20.1680672268907557% |
| 2018-10-30T00:00:00Z | a | 53.7815126050420176% |
| 2018-10-01T00:00:00Z | a | 26.0504201680672267% |
使用和:
查询
SELECT
*,
percentile95 / SUM(percentile95) OVER (PARTITION BY date_trunc('month', "date"))
* 100 as percentile_in_month
FROM
t
结果:
date name percentile95 percentile_in_month
2018-09-01 00:00:00 a 0.34 12.2743682310469
2018-09-02 00:00:00 a 0.41 14.8014440433213
2018-09-29 00:00:00 a 0.74 26.7148014440433
2018-09-30 00:00:00 a 0.39 14.0794223826715
2018-09-30 00:00:00 a 0.89 32.129963898917
2018-10-02 00:00:00 a 0.24 20.1680672268908
2018-10-30 00:00:00 a 0.64 53.781512605042
2018-10-01 00:00:00 a 0.31 26.0504201680672
date\u trunc
将日期标准化为月份
窗口函数对值进行分组(此处为截断日期)
聚合函数SUM
汇总窗口组中的所有值
采用汇总值和原始值计算百分比值
我有一个疑问。根据这一点,它说不可能计算总的百分位数。那么,真的有可能从百分位数中计算出百分位数吗?如果你想得到每年和每月的平均值,我想我不想要平均值。我想要这个月的百分位值。这说明平均百分位数是不正确的。@Jarvis请不要忘记对有用的答案进行投票(不仅仅是接受)。这是对人们为您所做工作的敬意。:)