在 group by 子句中连接数组

2023-11-23

我们在将数组分组为单个数组时遇到问题。 我们希望将两列中的值连接到一个数组中,并将这些多行数组聚合起来。

给定以下输入:

| id | name | col_1 | col_2 |
| 1  |  a   |   1   |   2   |
| 2  |  a   |   3   |   4   |
| 4  |  b   |   7   |   8   |
| 3  |  b   |   5   |   6   |

我们想要以下输出:

| a | { 1, 2, 3, 4 } |
| b | { 5, 6, 7, 8 } |

元素的顺序很重要,并且应与聚合行的 id 相关。

我们尝试了array_agg()功能:

SELECT array_agg(ARRAY[col_1, col_2]) FROM mytable GROUP BY name;

不幸的是,这个声明引发了一个错误:

ERROR: could not find array type for data type character varying[]

使用 group by 子句合并数组似乎是不可能的array_agg().

有任何想法吗?


UNION ALL

你可以“取消旋转”UNION ALL first:

SELECT name, array_agg(c) AS c_arr
FROM  (
   SELECT name, id, 1 AS rnk, col1 AS c FROM tbl
   UNION ALL
   SELECT name, id, 2, col2 FROM tbl
   ORDER  BY name, id, rnk
   ) sub
GROUP  BY 1;

进行调整以产生您稍后请求的值的顺序。手册:

聚合函数array_agg, json_agg, string_agg, and xmlagg, 以及类似的用户定义的聚合函数,产生 根据顺序的不同,结果值会有不同的意义 输入值。默认情况下未指定此顺序,但可以 通过写一个来控制ORDER BY聚合调用中的子句,如 如第 4.2.7 节所示。或者,提供输入值 排序子查询通常可以工作。

大胆强调我的。

LATERAL子查询 with VALUES表达

LATERAL需要Postgres 9.3或稍后。

SELECT t.name, array_agg(c) AS c_arr
FROM  (SELECT * FROM tbl ORDER BY name, id) t
CROSS  JOIN LATERAL (VALUES (t.col1), (t.col2)) v(c)
GROUP  BY 1;

相同的结果。只需要在桌子上经过一次即可。

自定义聚合函数

Or您可以创建一个自定义聚合函数,如这些相关答案中讨论的那样:

  • 选择数据到 Postgres 数组中
  • PostgreSQL 中是否有类似 zip() 函数的东西可以组合两个数组?
CREATE AGGREGATE array_agg_mult (anyarray)  (
    SFUNC     = array_cat
  , STYPE     = anyarray
  , INITCOND  = '{}'
);

然后你可以:

SELECT name, array_agg_mult(ARRAY[col1, col2] ORDER BY id) AS c_arr
FROM   tbl
GROUP  BY 1
ORDER  BY 1;

或者,通常更快,但不是标准 SQL:

SELECT name, array_agg_mult(ARRAY[col1, col2]) AS c_arr
FROM  (SELECT * FROM tbl ORDER BY name, id) t
GROUP  BY 1;

所添加的ORDER BY id(可以附加到此类聚合函数)保证您想要的结果:

a | {1,2,3,4}
b | {5,6,7,8}

或者您可能对这个替代方案感兴趣:

SELECT name, array_agg_mult(ARRAY[ARRAY[col1, col2]] ORDER BY id) AS c_arr
FROM   tbl
GROUP  BY 1
ORDER  BY 1;

它产生二维数组:

a | {{1,2},{3,4}}
b | {{5,6},{7,8}}

最后一个可以用内置的替换(并且应该是,因为它更快!)array_agg() in Postgres 9.5或更高版本 - 增加了聚合数组的功能:

SELECT name, array_agg(ARRAY[col1, col2] ORDER BY id) AS c_arr
FROM   tbl
GROUP  BY 1
ORDER  BY 1;

相同的结果。手册:

输入数组连接成一个更高维度的数组(输入 必须全部具有相同的维度,并且不能为空或 null)

所以和我们自定义的聚合函数不完全一样array_agg_mult();

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 group by 子句中连接数组 的相关文章

  • 将数组转换为具有默认值的对象的更简洁方法? (洛达什可用)

    我有一个数组 比如说 a b c 我想将其转换为一个对象 该对象以数组值作为键和我可以设置的默认值 所以如果默认值是true 我希望我的输出是 a true b true c true 下面的代码是否有更简洁的版本来实现此目的 var my
  • 如何搜索例程的内容/(SP-触发函数)

    我需要在数据库内所有例程的例程主体 存储过程 函数 触发器 中搜索文本 我该怎么做 Thanks SELECT OBJECT NAME object id FROM sys sql modules WHERE definition LIKE
  • 如何通过子 POJO 的属性过滤复合 ManyToMany POJO?

    我有两个像这样的房间实体 Entity public class Teacher implements Serializable PrimaryKey autoGenerate true public int id ColumnInfo n
  • MySQL中如何声明变量?

    如何在mysql中声明一个变量 以便我的第二个查询可以使用它 我想写一些类似的东西 SET start 1 SET finish 10 SELECT FROM places WHERE place BETWEEN start AND fin
  • 实现软删除的最佳方法是什么?

    目前在做一个项目 我们要对大部分用户 用户角色 实现软删除 我们决定添加一个is deleted 0 数据库中每个表的字段并将其设置为 1 如果特定用户角色点击特定记录上的删除按钮 现在为了将来的维护 每个SELECT查询需要确保它们不包含
  • JDBC插入实数数组

    我试图将一个真实的数组插入到 postgresql 数组中 该表的定义是 String sqlTable CREATE TABLE IF NOT EXISTS ccmBlock sampleId INTEGER block REAL 插入内
  • array_merge 更改键

    我得到以下数组 arr array 6 gt Somedata 7 gt Somedata1 8 gt Somedata2 问题是 当我使用array merge array Select the data arr 它确实将数组键更改为 A
  • 递归获取数组的键并创建下划线分隔的字符串

    现在我得到了一个包含某种信息的数组 我需要从中创建一个表 例如 Student Address StreetAddress gt Some Street StreetName gt Some Name Marks1 gt 100 Marks
  • 数据库字段中的逗号分隔值

    我有一个产品表 该表中的每一行对应一个产品 并由唯一的 ID 标识 现在 每个产品都可以有多个与该产品关联的 代码 例如 Id Code 0001 IN ON ME OH 0002 ON VI AC ZO 0003 QA PS OO ME
  • SQL Server 连接其他表中不存在的位置

    Service Asset AssetService Id Name Id Name AssetId ServiceId
  • 如何识别拼写不同的相似单词

    我想从数据库中过滤掉重复的客户名称 一位客户可能有多个同名但拼写差异不大的系统条目 这是一个示例 名为 Brook 的客户可能有 3 个系统条目 有了这个变化 布鲁克 贝尔塔 布鲁克 贝尔塔 比鲁克 贝尔塔 假设我们将此名称放入一个数据库列
  • dart中解析对象(不支持的操作:无法添加到固定长度列表)

    我有一个用户对象 当用户登录 注册时 该对象保存到云 Firestore 数据库中 因此 当用户登录时 将从数据库中检索用户对象 并且一切正常 直到我尝试对列表 usersProject 执行 添加 操作 Add the new proje
  • 在 VB.Net 中将字节数组转换为整数

    我想知道在 vb net 中将字节数组 长度 4 转换为整数的最佳方法是什么 我知道 BitConverter 但执行函数调用来执行应该可以通过复制 4 字节内存来完成的操作似乎相当浪费 同样 将单 双精度数从二进制表示形式转换为单 双精度
  • SELECT max(x) 返回 null;我怎样才能让它返回0?

    运行以下命令时如何返回 0 而不是 null SELECT MAX X AS MaxX FROM tbl WHERE XID 1 假设没有XID 1的行 or SELECT coalesce MAX X 0 AS MaxX FROM tbl
  • 日期语句之间的 JPQL SELECT [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我想将此 SQL 语句转换为等效的 JPQL SELECT FROM events WHERE events date BETWE
  • Supabase 客户端权限被拒绝,模式为 public

    每当我尝试使用 supabase supabase js 查询数据库时 都会收到错误 error hint null details null code 42501 message permission denied for schema
  • Spark SQL 中的 SQL LIKE

    我正在尝试使用 LIKE 条件在 Spark SQL 中实现联接 我正在执行连接的行看起来像这样 称为 修订 Table A 8NXDPVAE Table B 4 8 NXD V 在 SQL Server 上执行联接 A revision
  • 如何在 SQL Server 中连接

    我的数据库没有特定的列 因此我通过开关在查询中创建了一个列 我需要的是将此列与数据库中的另一列连接起来 select certificateDuration DurationType case when certificateDuratio
  • 在 LINQ 中按 Id 连接多表和分组

    我想按categoryId显示列表产品的名称组 这是我的代码 我想要我的视图显示结果 Desktop PC HP Red PC Dell Yellow PC Asus Red SmartPhone Lumia 720 Blue 我的组模型
  • 如何通过SQL查询检查是否有JSON函数?

    有SQL 2016 中的 JSON 函数 https learn microsoft com en us sql t sql functions json functions transact sql例如 JSON VALUE JSON Q

随机推荐

  • 如何减少 Android xml 布局中文本周围的填充?

    我有 1 英寸高的文本 但视图框占用 1 5 英寸 因此白色字体上方和下方有 1 4 英寸的黑色空间 我想减少 1 4 英寸 这样我就可以在 6 英寸屏幕上显示 5 行文本 而不是 4 行 我可以使用 android lineSpacing
  • 如何给 html 按钮标签添加图像

    我想知道是否有办法给出 HTML 按钮标签
  • 如何控制 Pelican 文章类别中的页面顺序?

    我正在使用 pelican jinja2 模板来生成基于类别的导航菜单 我需要一种方法来控制页面的顺序 或者至少需要一个技巧来允许我选择要列出的第一个页面 for a in articles if a category category l
  • 使用注释生成 equals / hashcode / toString

    我相信我在某处读到人们在编译时 使用 APT 通过确定哪些字段应该是哈希 相等测试的一部分来生成 equals hashcode toString 方法 我在网上找不到类似的东西 我可能梦见过它 可以这样做 public class Per
  • Or 与 OrElse

    有什么区别or and OrElse if temp is dbnull value or temp 0 产生错误 未为类型 DBNull 和类型 Integer 定义运算符 而这个就像一个魅力 if temp is dbnull valu
  • Expect 中的正则表达式

    我刚刚开始学习期望脚本 我一直在尝试从输出中提取以下内容 core 4046140998 01 10 133211 使用以下命令使用期望脚本 有人可以告诉我哪里出了问题吗 我想将整个字符串 即 core 4046140998 01 10 1
  • spring boot https PKCS12 DerInputStream.getLength(): lengthTag=111,太大

    我需要在 https 上使用 Spring boot 应用程序 我有一个 LetsEncrypt 签名的密钥 我将此证书转换为 PKCS12 如下所示 openssl pkcs12 export in fullchain pem inkey
  • 为什么 PL/SQL 中不允许静态 ddl?

    在 Oracle PL SQL 块中 为什么允许动态 sql begin execute immediate drop table table name end 但静态不是吗 begin drop table table name end
  • pyspark,比较数据框中的两行

    我试图将数据帧中的一行与下一行进行比较 以查看时间戳的差异 目前数据如下 itemid eventid timestamp 134 30 2016 07 02 12 01 40 134 32 2016 07 02 12 21 23 125
  • 在没有框架的情况下路由 REST 请求?

    我一直在阅读这篇文章来学习如何构建 REST API http www gen x design com archives create a rest api with php 有一次它说 假设您已将请求路由到用户的正确控制器 如果没有框架
  • 在张量流中使用 SSIM 损失函数处理 RGB 图像

    我想用SSIM指标作为我正在研究的模型的损失函数张量流 SSIM 应该测量去噪自动编码器的重构输出图像与输入未损坏图像之间的相似度 RGB 据我了解 为了在张量流中使用 SSIM 指标 图像应该是归一化为 0 1 或 0 255 而不是 1
  • 在 C++11 及以上版本中如何检查线程是否完成工作?

    如何在 C 11 及更高版本中检查线程是否已完成工作 我一直在阅读文档并编写了以下代码 include
  • phpMyAdmin - 波浪号 (~) 在行列中意味着什么?

    我最近升级了 Joomla 从 1 5 到 1 7 的安装 带有大量文章数据集 而升级方法是升级数据库 基本上将内容插入到另一个表中 我注意到Rows列值以波形符 为前缀 现在 乍一看 我认为这意味着该值是近似值 因为当我刷新页面时 我看到
  • java中如何从系统字体中获取ttf字体数据

    我的系统上安装了一些 ttf 字体 我使用得到该列表 GraphicsEnvironment getLocalGraphicsEnvironment getAvailableFontFamilyNames 这不仅是 ttf 字体 而且是我猜
  • 如何在 Angular2 中实现可折叠侧边栏?

    我正在学习 angular2 并希望实现一个可折叠的侧边栏 类似于https almsaeedstudio com themes AdminLTE index2 html 在 Angular 2 中 我尝试查找示例 但找不到任何示例 您能提
  • PHP/PostgreSQL:检查准备好的语句是否已存在

    我将准备好的声明创建为 pg prepare stm name SELECT 今天 我在两次声明同名的准备好的语句时遇到了问题 错误地调用了两次函数 Warning pg prepare function pg prepare Query
  • 已添加片段:DateDialog

    我已经让我的editText可点击 点击后会显示DatePicker dialog public void onCreate Bundle savedInstanceState super onCreate savedInstanceSta
  • 在chrome中,使用window.Clipboard对象,有没有办法捕获粘贴的文本?

    您可以捕获图像 我正在尝试找出如何捕获文本 出于安全原因 我猜没有 但我想确定一下 还有这个东西有参考吗 window Clipboardobject 不是 v8 引擎的一部分 它是 chrome 浏览器的一部分 我找不到它的官方文档 在您
  • 有没有更好的方法来进行 C 风格的错误处理?

    我正在尝试通过编写一个简单的解析器 编译器来学习C 到目前为止 这是一次非常有启发性的经历 但是 由于具有强大的 C 背景 我在调整方面遇到了一些问题 特别是缺乏例外情况 现在我已经读过了更干净 更优雅 更难辨认我同意那篇文章中的每一个字
  • 在 group by 子句中连接数组

    我们在将数组分组为单个数组时遇到问题 我们希望将两列中的值连接到一个数组中 并将这些多行数组聚合起来 给定以下输入 id name col 1 col 2 1 a 1 2 2 a 3 4 4 b 7 8 3 b 5 6 我们想要以下输出 a