我有一个存储如下值的表:

| id | thing | values |
|----|-------|--------|
| 1  | a     |[1, 2]  |
| 2  | b     |[2, 3]  |
| 3  | a     |[2, 3]  |

并希望使用聚合函数按thing分组,但只存储数组的唯一值,这样结果将是:

| thing | values  |
|-------|---------|
| a     |[1, 2, 3]|
| b     |[2, 3]   |

有没有一种简单而有效的方法可以在研究生中做到这一点?

推荐答案

首先,将JSON数组与json_array_elements()分开——这是一个集合返回函数,带有JOIN LATERAL,得到一行idthing,每个元素有一个JSON数组元素.

然后为thingvalue Select DISTINCT条记录,按value排序.

最后你把记录加起来,加上json_agg().

在SQL中,它看起来像:

SELECT thing, json_agg(value) AS values
FROM (
    SELECT DISTINCT thing, value
    FROM t
    JOIN LATERAL json_array_elements(t.values) AS v(value) ON true
    ORDER BY value) x
GROUP BY thing

一般来说,你会希望使用jsonb型,因为它比json型更有效.然后你必须使用相应的jsonb_...()个函数.

Postgresql相关问答推荐

Postgr不列出运算符和函数

如何在 postgres where 子句中使用 or 对条件进行组合或分组

使用 pgx 扫描范围类型

空表上的 Postgres 意外行为

表示 SQL 表的 Go struct

从dump文件中恢复三张表遇到的问题

函数将多列作为单列而不是多列返回

我应该使用哪个 postgresql 包?

从 PostgreSQL 中的数字获取月份名称

在PostgreSQL中 Select 数组列的总和

Postgres jsonbNOT contains运算符

如何在 psql 控制台中打印当前工作目录?

如何创建 postgres 数据库模式的 sql 脚本?

防止 CHARACTER VARYING 字段中出现空字符串

带有 WITH 子句的查询时出现 Postgresmissing FROM-clause entry错误

使用 SQLAlchemy 进行 PostgreSQL ILIKE 查询

如何为 postgres 编写 DELETE CASCADE?

如何在创建数据库时安装 Postgres 扩展?

基于秒的 Postgresql 日期差异

pg_restore 目录错误