Postgres GROUP BY Array Column - PullRequest
       9

Postgres GROUP BY Array Column

0 голосов
/ 03 июня 2018

Я использую 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 голосов
/ 03 июня 2018

Вам не нужно создавать отдельную функцию для этого.Все это может быть сделано в одном выражении:

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

Это rextester .

0 голосов
/ 03 июня 2018

[A, B, C] и [C, B, A] - это разные массивы, даже если они имеют одинаковые элементы, они не находятся в одинаковом положении, они никогда не будут сгруппированы по предложению group by, если вычтобы сделать их эквивалентными, вам нужно сначала отсортировать их.

В этой теме у вас есть информация о наших сортировочных массивах.

Вы должны сделать что-то вроде:

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)
$$;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...