PostgreSQL 聚合函数讲解 - 3 总体|样本 方差, 标准方差

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
云原生数据库 PolarDB 分布式版,标准版 2核8GB
简介:
PostgreSQL自带了一些常用的统计学聚合函数, 非常好用.
本文介绍一下方差和标准差的一些聚合函数.


总体方差 : population covariance
总体标准差 : population standard deviation
样本方差 : sample covariance
样本标准差 : sample standard deviation
均值 :  mean

样本均值和样本方差的介绍 : 
http://en.wikipedia.org/wiki/Sample_mean_and_sample_covariance
均值介绍 : 
http://en.wikipedia.org/wiki/Mean

对方差, 标准差, 均值不了解的话, 建议参考网易公开课, 统计学.
浅显易懂.
http://v.163.com/special/Khan/khstatistics.html
http://v.ku6.com/playlist/index_6598382.html

PostgreSQL计算方差, 标准差的聚合函数如下 : 
http://www.postgresql.org/docs/devel/static/functions-aggregate.html

其中stddev和variance是stddev_samp和var_samp的别名.
这些函数用于计算数据集的总体/样本 方差,总体/样本 标准差.
例如 : 
1,2,3,100 这组数据共4个值, 总体均值和样本均值分别为 : 
(1+2+3+100)/4 = 26.5
总体方差 : ((1-26.5)^2 + (2-26.5)^2 + (3-26.5)^2 + (100-26.5)^2)/4 = 1801.25
样本方差 : ((1-26.5)^2 + (2-26.5)^2 + (3-26.5)^2 + (100-26.5)^2)/(4-1) = 2401.6666....
总体标准差 : 平方根(总体方差) = 42.4411357058220109
样本标准差 : 平方根(样本方差) = 49.0068022489395513
使用PostgreSQL计算如下 : 
postgres=# select variance(id) from (values(1),(2),(3),(100)) as t(id);
       variance        
-----------------------
 2401.6666666666666667
(1 row)
postgres=# select var_pop(id) from (values(1),(2),(3),(100)) as t(id);
        var_pop        
-----------------------
 1801.2500000000000000
(1 row)
postgres=# select var_samp(id) from (values(1),(2),(3),(100)) as t(id);
       var_samp        
-----------------------
 2401.6666666666666667
(1 row)
postgres=# select stddev(id) from (values(1),(2),(3),(100)) as t(id);
       stddev        
---------------------
 49.0068022489395513
(1 row)
postgres=# select stddev_pop(id) from (values(1),(2),(3),(100)) as t(id);
     stddev_pop      
---------------------
 42.4411357058220109
(1 row)
postgres=# select stddev_samp(id) from (values(1),(2),(3),(100)) as t(id);
     stddev_samp     
---------------------
 49.0068022489395513
(1 row)

[参考]
1. src/backend/utils/adt/float.c
/*
 *              =========================
 *              FLOAT AGGREGATE OPERATORS
 *              =========================
 *
 *              float8_accum            - accumulate for AVG(), variance aggregates, etc.
 *              float4_accum            - same, but input data is float4
 *              float8_avg                      - produce final result for float AVG()
 *              float8_var_samp         - produce final result for float VAR_SAMP()
 *              float8_var_pop          - produce final result for float VAR_POP()
 *              float8_stddev_samp      - produce final result for float STDDEV_SAMP()
 *              float8_stddev_pop       - produce final result for float STDDEV_POP()
 *
 * The transition datatype for all these aggregates is a 3-element array
 * of float8, holding the values N, sum(X), sum(X*X) in that order.
 *
 * Note that we represent N as a float to avoid having to build a special
 * datatype.  Given a reasonable floating-point implementation, there should
 * be no accuracy loss unless N exceeds 2 ^ 52 or so (by which time the
 * user will have doubtless lost interest anyway...)
 */
..................
Datum
float8_var_pop(PG_FUNCTION_ARGS)
{
        ArrayType  *transarray = PG_GETARG_ARRAYTYPE_P(0);
        float8     *transvalues;
        float8          N,
                                sumX,
                                sumX2,
                                numerator;

        transvalues = check_float8_array(transarray, "float8_var_pop", 3);
        N = transvalues[0];
        sumX = transvalues[1];
        sumX2 = transvalues[2];

        /* Population variance is undefined when N is 0, so return NULL */
        if (N == 0.0)
                PG_RETURN_NULL();

        numerator = N * sumX2 - sumX * sumX;
        CHECKFLOATVAL(numerator, isinf(sumX2) || isinf(sumX), true);

        /* Watch out for roundoff error producing a negative numerator */
        if (numerator <= 0.0)
                PG_RETURN_FLOAT8(0.0);

        PG_RETURN_FLOAT8(numerator / (N * N));
}

Datum
float8_var_samp(PG_FUNCTION_ARGS)
{
        ArrayType  *transarray = PG_GETARG_ARRAYTYPE_P(0);
        float8     *transvalues;
        float8          N,
                                sumX,
                                sumX2,
                                numerator;

        transvalues = check_float8_array(transarray, "float8_var_samp", 3);
        N = transvalues[0];
        sumX = transvalues[1];
        sumX2 = transvalues[2];

        /* Sample variance is undefined when N is 0 or 1, so return NULL */
        if (N <= 1.0)
                PG_RETURN_NULL();

        numerator = N * sumX2 - sumX * sumX;
        CHECKFLOATVAL(numerator, isinf(sumX2) || isinf(sumX), true);

        /* Watch out for roundoff error producing a negative numerator */
        if (numerator <= 0.0)
                PG_RETURN_FLOAT8(0.0);

        PG_RETURN_FLOAT8(numerator / (N * (N - 1.0)));
}

Datum
float8_stddev_pop(PG_FUNCTION_ARGS)
{
        ArrayType  *transarray = PG_GETARG_ARRAYTYPE_P(0);
        float8     *transvalues;
        float8          N,
                                sumX,
                                sumX2,
                                numerator;

        transvalues = check_float8_array(transarray, "float8_stddev_pop", 3);
        N = transvalues[0];
        sumX = transvalues[1];
        sumX2 = transvalues[2];

        /* Population stddev is undefined when N is 0, so return NULL */
        if (N == 0.0)
                PG_RETURN_NULL();

        numerator = N * sumX2 - sumX * sumX;
        CHECKFLOATVAL(numerator, isinf(sumX2) || isinf(sumX), true);

        /* Watch out for roundoff error producing a negative numerator */
        if (numerator <= 0.0)
                PG_RETURN_FLOAT8(0.0);

        PG_RETURN_FLOAT8(sqrt(numerator / (N * N)));
}

Datum
float8_stddev_samp(PG_FUNCTION_ARGS)
{
        ArrayType  *transarray = PG_GETARG_ARRAYTYPE_P(0);
        float8     *transvalues;
        float8          N,
                                sumX,
                                sumX2,
                                numerator;

        transvalues = check_float8_array(transarray, "float8_stddev_samp", 3);
        N = transvalues[0];
        sumX = transvalues[1];
        sumX2 = transvalues[2];

        /* Sample stddev is undefined when N is 0 or 1, so return NULL */
        if (N <= 1.0)
                PG_RETURN_NULL();

        numerator = N * sumX2 - sumX * sumX;
        CHECKFLOATVAL(numerator, isinf(sumX2) || isinf(sumX), true);

        /* Watch out for roundoff error producing a negative numerator */
        if (numerator <= 0.0)
                PG_RETURN_FLOAT8(0.0);

        PG_RETURN_FLOAT8(sqrt(numerator / (N * (N - 1.0))));
}
相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
10月前
|
关系型数据库 大数据 PostgreSQL
PostgreSQL16-新特性-并行聚合
PostgreSQL16-新特性-并行聚合
103 0
|
关系型数据库 PostgreSQL
PostgreSQL listagg within group (order by) 聚合兼容用法 string_agg ( order by) - 行列变换,CSV构造...
标签 PostgreSQL , order-set agg , listagg , string_agg , order 背景 listagg — Rows to Delimited Strings The listagg function transforms values from a g...
5875 0
|
存储 并行计算 Cloud Native
PolarDB 开源版 使用TimescaleDB 实现时序数据高速写入、压缩、实时聚合计算、自动老化等
PolarDB 开源版 使用TimescaleDB 实现时序数据高速写入、压缩、实时聚合计算、自动老化等
859 0
|
SQL 存储 算法
PolarDB-X 1.0-用户指南-SQL调优指南-SQL调优进阶-优化聚合与排序
本文介绍如何优化器和执行器如何处理聚合(Group-by)与排序(Order-by)算子,以达到减少数据传输量和提高执行效率的效果。
186 0
|
关系型数据库 PostgreSQL
【重新发现PostgreSQL之美】- 48 聚合、窗口过滤器
大家好,这里是重新发现PostgreSQL之美 - 48 聚合、窗口过滤器
|
SQL 分布式计算 并行计算
PostgreSQL 并行计算解说 之9 - parallel 自定义并行聚合
标签 PostgreSQL , cpu 并行 , smp 并行 , 并行计算 , gpu 并行 , 并行过程支持 背景 PostgreSQL 11 优化器已经支持了非常多场合的并行。简单估计,已支持27余种场景的并行计算。 parallel seq scan parallel index scan
561 0
|
SQL 关系型数据库 PostgreSQL
PostgreSQL 空间聚合性能 - 行政区、电子围栏 空间聚合 - 时间、空间热力图
标签 PostgreSQL , 空间聚合 , 空间热力图 , 行政区 , 电子围栏 背景 某个时间区间(或其他条件),出现在某些围栏、行政区(多边形信息)中的对象(空间点信息)有多少,按颜色深浅渲染这些多边形。
2404 0
|
物联网 关系型数据库 流计算
PostgreSQL pipelinedb 流计算插件 - IoT应用 - 实时轨迹聚合
标签 PostgreSQL , IoT , 轨迹聚合 , pipelinedb , 流计算 , 实时聚合 背景 IoT场景,车联网场景,共享单车场景,人的行为位点等,终端实时上报的是孤立的位点,我们需要将其补齐成轨迹。
1783 0

相关产品

  • 云原生数据库 PolarDB