Postgres GROUP BY Array Column

时间:2018-06-03 07:02:01

标签: sql arrays postgresql group-by

我使用postgres&有一个这样的表:

id   | arr
-------------------
 1   | [A,B,C]
 2   | [C,B,A]
 3   | [A,A,B]
 4   | [B,A,B]

我创建了一个GROUP BY' arr'查询。

SELECT COUNT(*) AS total, "arr" FROM "table" GROUP BY "arr"

......结果:

total | arr
-------------------
 1    | [A,B,C]
 1    | [C,B,A]
 1    | [A,A,B]
 1    | [B,A,B]

但是,因为[A,B,C]和[C,B,A]具有相同的元素,所以我预期结果应该是这样的:

total | arr
-------------------
  2   |   [A,B,C]
  2   |   [A,A,B]

我错过了什么(在查询中)还是?请帮帮我..

2 个答案:

答案 0 :(得分:3)

您无需创建单独的功能即可完成此操作。它可以在一个声明中完成:

select array(select unnest(arr) order by 1) as sorted_arr, count(*)
from t
group by sorted_arr;

这是rextester

答案 1 :(得分:2)

[A,B,C]和[C,B,A]是不同的数组,即使它们具有相同的元素,它们不在同一个位置,它们永远不会被group by子句分组,以防万一你想要使它们等效,你需要先对它们进行排序。

this thread上,你有信息排序数组。

您应该执行以下操作:

SELECT COUNT(*) AS total, array_sort("arr") FROM "table" GROUP BY array_sort("arr")

创建类似于那里建议的排序函数后:

CREATE OR REPLACE FUNCTION array_sort (ANYARRAY)
RETURNS ANYARRAY LANGUAGE SQL
AS $$
SELECT ARRAY(SELECT unnest($1) ORDER BY 1)
$$;