PostgreSQL 函数ARRAY_AGG详解
ARRAY_AGG
是用于将多行数据聚合为一个数组的函数,在支持数组类型的数据库系统中广泛使用,以下以常见的 PostgreSQL 数据库为例,对 ARRAY_AGG
进行详细介绍:
基本语法
ARRAY_AGG ( expression [ORDER BY expression [ASC | DESC] [NULLS {FIRST | LAST}]] )
expression
:要聚合为数组的列名或者表达式,可以是单个列,也可以是经过计算的结果。ORDER BY
(可选):用于指定聚合时数组内元素的排序顺序,ASC
表示升序(默认),DESC
表示降序。NULLS FIRST
表示将NULL
值排在数组前面,NULLS LAST
表示将NULL
值排在数组后面。
示例
假设有一个名为 students
的表,包含 student_id
、student_name
和 scores
字段,记录学生的编号、姓名和成绩,下面通过不同示例展示 ARRAY_AGG
的用法:
1. 简单聚合
将所有学生的成绩聚合为一个数组:
SELECT ARRAY_AGG(scores) AS all_scores FROM students;
查询结果会得到一个包含所有学生成绩的数组,例如 {85, 90, 78, ...}
。
2. 分组聚合
按班级分组,将每个班级学生的成绩分别聚合为数组:
SELECT class_id, ARRAY_AGG(scores) AS class_scores FROM students GROUP BY class_id ORDER BY class_id;
假设 students
表中有 class_id
字段表示学生所在班级,上述查询会根据班级分组,每个班级对应一个包含该班级所有学生成绩的数组。比如班级 1
的成绩数组可能是 {88, 92, 80}
,班级 2
的成绩数组可能是 {75, 82, 95}
。
3. 聚合时排序
按班级分组,将每个班级学生的成绩聚合为数组,并且成绩在数组中按降序排列:
SELECT class_id, ARRAY_AGG(scores ORDER BY scores DESC) AS sorted_class_scores FROM students GROUP BY class_id ORDER BY class_id;
这种情况下,每个班级对应的成绩数组中,成绩从高到低排列,例如班级 1
的成绩数组可能是 {92, 88, 80}
。
4. 对聚合的结果进一步操作
在得到聚合数组后,还可以对数组进行一些操作,比如获取数组的长度。假设我们想知道每个班级成绩数组的长度,即班级学生人数:
SELECT class_id, ARRAY_AGG(scores) AS class_scores,array_length(ARRAY_AGG(scores), 1) AS student_count FROM students GROUP BY class_id ORDER BY class_id;
这里使用 array_length
函数获取 ARRAY_AGG(scores)
生成的数组长度,1
表示获取数组第一维的长度(对于一维数组就是数组元素个数) 。
其他支持的数据库
除了 PostgreSQL,像 Greenplum(基于 PostgreSQL 开发)、Redshift 等数据库也支持 ARRAY_AGG
函数,用法基本类似。在 MySQL 8.0 及以上版本,虽然没有完全一样的 ARRAY_AGG
,但可以使用 JSON_ARRAYAGG
函数实现类似功能,用于生成 JSON 格式的数组 ,如:
SELECT class_id, JSON_ARRAYAGG(scores) AS class_scores FROM students GROUP BY class_id ORDER BY class_id;
MySQL 中对数组的后续操作和 PostgreSQL 会有一定差异,需要根据 MySQL 的相关函数来处理。