我使用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]
我错过了什么(在查询中)还是?请帮帮我..
答案 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)
$$;