当前位置: 首页 > news >正文

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_idstudent_namescores 字段,记录学生的编号、姓名和成绩,下面通过不同示例展示 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 的相关函数来处理。

http://www.dtcms.com/a/486070.html

相关文章:

  • 【OpenHarmony】MSDP设备状态感知模块架构
  • RAG 多模态 API 处理系统设计解析:企业级大模型集成架构实战
  • 通过一个typescript的小游戏,使用单元测试实战(二)
  • 多物理域协同 + 三维 CAD 联动!ADS 2025 解锁射频前端、天线设计新体验
  • 前端微服务架构解析:qiankun 运行原理详解
  • linux ssh config详解
  • 内网攻防实战图谱:从红队视角构建安全对抗体系
  • 鲲鹏ARM服务器配置YUM源
  • 网站分类标准沈阳网站制作招聘网
  • 建设一个网站需要几个角色建筑工程网课心得体会
  • 基于Robosuite和Robomimic采集mujoco平台的机械臂数据微调预训练PI0模型,实现快速训练机械臂任务
  • 深度学习目标检测项目
  • SQL 窗口函数
  • 盟接之桥浅谈目标落地的底层逻辑:实践、分解与认知跃迁
  • 【Qt】4.项目文件解析
  • Redis-布隆过滤器BloomFilter
  • 网站建设找至尚网络深圳制作企业网站
  • 网页是网站吗苏州刚刚发生的大事
  • WPF中RelayCommand的实现与使用详解
  • 百度天气:空气质量WebGIS可视化的创新实践 —— 以湖南省为例
  • Flutter---GridView+自定义控件
  • OJ竞赛平台----C端题目列表
  • 【完整源码+数据集+部署教程】行人和斑马线检测系统源码和数据集:改进yolo11-RFCBAMConv
  • 做海淘的网站做海淘的网站网站建设案例步骤
  • [Zer0pts2020]Can you guess it?
  • Go 通道非阻塞发送:优雅地处理“通道已满”的场景
  • 设计模式【工厂模式和策略模式】
  • 【Go】P6 Golang 基础:流程控制
  • Perl 基础语法
  • 酒店网站模板网站开发好的语言