Подсчитать количество различных элементов в массиве varchar Postgres - PullRequest
2 голосов
/ 28 апреля 2020

У меня есть стол.

title   | tags
--------------------------
post1   | {tag1,tag2,tag3}
post2   | {tag1,tag2}
post3   | {tag1}

Это было сделано с помощью этого:

CREATE TABLE post (
    title varchar(10),
    tags varchar(10) array[5]
);

INSERT INTO post (title, tags) VALUES ('post1', '{"tag1", "tag2", "tag3"}');
INSERT INTO post (title, tags) VALUES ('post2', '{"tag1", "tag2"}');
INSERT INTO post (title, tags) VALUES ('post3', '{"tag1"}');

Как подсчитать количество различных элементов в массиве для всей таблицы? Например, тег tag1 появляется во всех трех строках, поэтому он должен вернуть 3. Я хочу сделать это для каждого элемента, создавая вывод, который выглядит следующим образом:

tag     | COUNT
--------------------------
tag1    | 3
tag2    | 2
tag3    | 1

tags В массиве не будет дубликатов.

1 Ответ

3 голосов
/ 28 апреля 2020

Вы можете unnest() массив, затем агрегировать:

select t.tag, count(*) no_posts
from post p
cross join lateral unnest(p.tags) t(tag)
group by t.tag
order by no_posts desc

Демонстрация на БД Fiddle :

tag  | no_posts
:--- | -------:
tag1 |        3
tag2 |        2
tag3 |        1
...