Postgres 唯一 JSON 数组聚合值
Postgres Unique JSON Array Aggregate Values
我有一个 table 存储这样的值:
| 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] |
在 Postgres 中是否有一种简单且高效的方法来执行此操作?
首先你将 JSON 数组与 json_array_elements()
分开 - 这是一个 set-returning 函数与 JOIN LATERAL
你得到一行 id
, thing
和每个元素的 JSON 数组元素。
然后您 select DISTINCT
记录 thing
和 value
,按 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_...()
函数。
我有一个 table 存储这样的值:
| 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] |
在 Postgres 中是否有一种简单且高效的方法来执行此操作?
首先你将 JSON 数组与 json_array_elements()
分开 - 这是一个 set-returning 函数与 JOIN LATERAL
你得到一行 id
, thing
和每个元素的 JSON 数组元素。
然后您 select DISTINCT
记录 thing
和 value
,按 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_...()
函数。