`
骑猪逛街666
  • 浏览: 141809 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

PostgreSQL 聚合表达式 FILTER , order , within group 用法

 
阅读更多

 标签 PostgreSQL , 聚合 , filter , order , within group 背景 PostgreSQL的分析功能还是比较强大的,例如支持多维分析,支持4大类聚合,支持窗口查询,支持递归查询等。

标签

PostgreSQL , 聚合 , filter , order , within group


背景

PostgreSQL的分析功能还是比较强大的,例如支持多维分析,支持4大类聚合,支持窗口查询,支持递归查询等。

4大类聚合的用法请参考

《PostgreSQL aggregate function 1 : General-Purpose Aggregate Functions》

《PostgreSQL aggregate function 2 : Aggregate Functions for Statistics》

《PostgreSQL aggregate function 3 : Aggregate Functions for Ordered-Set》

《PostgreSQL aggregate function 4 : Hypothetical-Set Aggregate Functions》

多维分析请参考

《Greenplum 最佳实践 - 多维分析的使用(CUBE, ROLLUP, GROUPING SETS in GreenPlum and Oracle)》

《PostgreSQL 9.5 new feature - Support GROUPING SETS, CUBE and ROLLUP.》

窗口查询请参考

《时序数据合并场景加速分析和实现 - 复合索引,窗口分组查询加速,变态递归加速》

《快速入门PostgreSQL应用开发与管理 - 4 高级SQL用法》

递归查询请参考

《快速入门PostgreSQL应用开发与管理 - 3 访问数据》

本文主要介绍一下聚合表达式的高级用法

aggregate_name (expression [ , ... ] [ order_by_clause ] ) [ FILTER ( WHERE filter_clause ) ]  
  
aggregate_name (ALL expression [ , ... ] [ order_by_clause ] ) [ FILTER ( WHERE filter_clause ) ]  
  
aggregate_name (DISTINCT expression [ , ... ] [ order_by_clause ] ) [ FILTER ( WHERE filter_clause ) ]  
  
aggregate_name ( * ) [ FILTER ( WHERE filter_clause ) ]  
  
aggregate_name ( [ expression [ , ... ] ] ) WITHIN GROUP ( order_by_clause ) [ FILTER ( WHERE filter_clause ) ]  

例子

1. 我们在分组后,需要查出分组中复合条件的count,以及分组的count。

postgres=# create table test(id int, c1 int);  
CREATE TABLE  
postgres=# insert into test select generate_series(1,10000), random()*10;  
INSERT 0 10000  
  
postgres=# select * from test limit 10;  
 id | c1   
----+----  
  1 | 10  
  2 |  4  
  3 |  6  
  4 |  1  
  5 |  4  
  6 |  9  
  7 |  9  
  8 |  7  
  9 |  5  
 10 |  4  
(10 rows)  
postgres=# select count(*), count(*) filter (where id<1000) from test group by c1;  
 count | count   
-------+-------  
  1059 |   118  
   998 |   109  
   999 |   101  
  1010 |    95  
   468 |    48  
   544 |    43  
   964 |   107  
   956 |   103  
  1021 |    87  
   977 |   101  
  1004 |    87  
(11 rows)  

2. 我们需要按顺序,将多条记录,聚合为一个字符串或数组,同样也可以加filter,只聚合复合条件的记录

postgres=# select string_agg(id::text, '-' order by id) filter (where id<100) from test group by c1;  
                string_agg                   
-------------------------------------------  
 35-65-74-97  
 4-12-19-31-36-40-85-89-90-98-99  
 17-18-22-42-43-44-58-59-64-70-75-83-84  
 11-14-15-16-21-30-41-54-62-67-73-80-81-94  
 2-5-10-51-79-93-96  
 9-26-45-46-47-61  
 3-27-28-37-48-55-56-68-69-77-92  
 8-20-24-33-34-49-50-60-63-66-78-91  
 25-39-53-57-71-76-82-87-95  
 6-7-29-32-38-72-86-88  
 1-13-23-52  
(11 rows)  

3. 我们需要去每个分组,某个字段中值

postgres=# select percentile_cont(0.5) within group (order by id) from test group by c1;  
 percentile_cont   
-----------------  
          4911.5  
            5210  
            4698  
          4699.5  
            4955  
          5061.5  
            5115  
            5176  
          4897.5  
            5087  
            4973  
(11 rows)  

4. 去过滤条件后的中值

postgres=# select percentile_cont(0.5) within group (order by id) filter (where id<100) from test group by c1;  
 percentile_cont   
-----------------  
            69.5  
              40  
              58  
            47.5  
              51  
            45.5  
              55  
            49.5  
              71  
              35  
              18  
(11 rows)  

小结

PostgreSQL 的分析方法很全面,建议用户可以多了解一下我在开始时给出的链接,帮助提高生产力。

参考

https://www.postgresql.org/docs/9.6/static/sql-expressions.html#SYNTAX-AGGREGATES

本文为云栖社区原创内容,未经允许不得转载,如需转载请发送邮件至yqeditor@list.alibaba-inc.com
分享到:
评论

相关推荐

    PostgreSQL 正则表达式 常用函数的总结

    PostgreSQL 正则表达式 常用函数的总结 对那些需要进行复杂数据处理的程序来说,正则表达式无疑是一个非常有用的工具。本文重点在于阐述 PostgreSQL 的一些常用正则表达式函数以及源码中的一些函数。 正则相关部分的...

    Sequelize中用group by进行分组聚合查询

    在SQL中,分组查询是通过`GROUP BY`子句来实现的,它可以将数据按照一个或多个列的值进行分组,通常结合聚合函数一起使用,以便对每个分组执行计算。 1. SQL中的分组查询 在SQL中,使用`GROUP BY`语句进行分组操作...

    postgresql inject and filter

    根据给定文件的信息,我们可以提炼出关于 PostgreSQL 注入与过滤技术的相关知识点。 ### PostgreSQL 注入与过滤技术 #### 一、引言 根据 WhiteHat 的网站安全统计报告(2009 年发布,可访问 ...

    postgresql 开发指南

    Postgresql 支持 GROUP BY 语句,使用 GROUP BY 语句可以对表中的数据进行分组。例如: ```sql SELECT * FROM emp GROUP BY dept; ``` Rollup 语句 Postgresql 支持 ROLLUP 语句,使用 ROLLUP 语句可以对表中的...

    DB2到GreenPlum/PostgreSQL的转换指南

    - ORDER BY、GROUP BY、HAVING子句的使用方法。 - 动态游标、连接操作、子查询的处理方式。 - UNION和UNION ALL的用法。 - 动态SQL的实现。 - 条件处理、打印输出消息、隐式类型转换等内容。 #### 2. 转换参考 ###...

    postgresql9.6.zip

    在使用PostgreSQL 9.6时,你可以利用其丰富的功能,如窗口函数、递归公共表表达式、JSONB数据类型和多版本并发控制(MVCC),以构建高效、可靠和可扩展的数据库解决方案。同时,PostgreSQL还拥有活跃的社区支持,...

    PostgreSQL 12.2安装与使用

    PostgreSQL 12.2 安装与使用 PostgreSQL 是一种功能强大且广泛应用的开源关系数据库管理系统,本文档旨在为初学者提供一个详细的 PostgreSQL 12.2 安装与使用指南。 创建用户与环境配置 在安装 PostgreSQL 之前,...

    PostgreSQL中文手册9.2

    PostgreSQL中文学习手册 PostgreSQL PostgreSQL PostgreSQL学习手册 学习手册 学习手册 (数据表 数据表 ) 4 一、表的定义: 一、表的定义: 一、表的定义: . 4 PostgreSQL PostgreSQL PostgreSQL学习手册 学习手册...

    PostgreSQL开发指南

    从简单的SELECT查询,到WHERE子句筛选数据,再到ORDER BY进行排序,OFFSET和FETCH实现分页,以及GROUP BY和聚合函数进行数据汇总,这一系列章节帮助读者掌握SQL核心功能。此外,连接查询(JOIN)章节介绍了多种连接...

    Postgresql-10安装包

    1. **并行查询优化**:PostgreSQL 10 引入了并行查询功能,使得大型表的扫描和聚合操作可以在多核处理器上并行执行,大大提高了处理大数据集的速度。 2. **分区表**:新版本支持范围和列表分区,允许用户根据特定...

    PostgreSQL修炼之道 从小工到专家.pptx

    PostgreSQL修炼之道:从小工到专家 PostgreSQL是一种功能强大且广泛应用的开源关系型数据库管理系统,本书《PostgreSQL修炼之道:从小工到专家》旨在帮助读者深入理解PostgreSQL的核心原理和最佳实践,从而提升...

    PostgreSQL(postgresql-14.1.tar.bz2)

    PostgreSQL(postgresql-14.1.tar.bz2) PostgreSQL是一种特性非常齐全的自由软件的对象-关系型数据库管理系统(ORDBMS),是以加州大学计算机系开发的POSTGRES,4.2版本为基础的对象关系型数据库管理系统。...

    PostgreSQL(postgresql-14.1.tar.gz)

    PostgreSQL(postgresql-14.1.tar.gz) PostgreSQL是一种特性非常齐全的自由软件的对象-关系型数据库管理系统(ORDBMS),是以加州大学计算机系开发的POSTGRES,4.2版本为基础的对象关系型数据库管理系统。POSTGRES...

    PostgreSQL数据库内部原理剖析 PDF

    A Tour of PostgreSQL Internals.pdf Inside the PostgreSQL Query Optimizer.pdf Inside the PostgreSQL Shared Buffer Cache.pdf Internals Of PostgreSQL Wal.pdf PostgreSQL Internals Through Pictures.pdf ...

    PostgreSQL(postgresql-13.5.tar.bz2)

    PostgreSQL(postgresql-13.5.tar.bz2) PostgreSQL是一种特性非常齐全的自由软件的对象-关系型数据库管理系统(ORDBMS),是以加州大学计算机系开发的POSTGRES,4.2版本为基础的对象关系型数据库管理系统。...

    PostgreSQL 9.6 RPM包

    PostgreSQL 9.6 RPM包是一款专为Linux系统设计的数据库管理系统安装包,采用RPM(Red Hat Package Manager)格式,适用于基于RPM的Linux发行版,如CentOS、Fedora、RHEL等。PostgreSQL是一款强大的开源关系型数据库...

    postgresql8.2.3用户手册API

    PostgreSQL 8.2.3支持标准SQL,并扩展了多种高级特性,如窗口函数、递归公共表表达式(CTEs)、存储过程等。API手册会详细解释如何在程序中正确使用这些SQL语句。 三、C语言API PostgreSQL的核心API主要是用C语言...

    PostgreSQL-10.1开发手册(英文版)

    这些内容为读者理解PostgreSQL的背景和使用方法提供了入口。 在教程部分,手册介绍了如何开始使用PostgreSQL。包括如何进行安装、理解数据库架构基础、创建数据库、以及如何访问数据库。紧接着,手册介绍了SQL语言...

    Matlab与PostgreSQL数据库的连接

    使用 Matlab 连接 PostgreSQL 数据库需要使用 database 函数。该函数的语法为:connection = database(database_name, database_user, user_password, 'Vendor', 'PostGreSQL');其中,database_name 是数据库的名称...

Global site tag (gtag.js) - Google Analytics