Подсчет вхождений строки из каждого столбца (Postgres) - PullRequest
0 голосов
/ 15 апреля 2020

Итак, у меня есть база данных с простой структурой, подобной этой


  CAT   | DOG   | FISH   
+-------+-------+--------+
| red   | blue  | orange |
+-------+-------+--------+
| green | black | white  |
+-------+-------+--------+
| red   | black | orange |
+-------+-------+--------+

Я хочу иметь возможность получить таблицу или объект или что-то еще, где она сообщает мне частоту каждой строки в каждом столбце. Поэтому, когда я запускаю запрос, я хочу увидеть что-то вроде

{cat: {"red": 2, "green": 1}, dog: {"blue": 1, "black": 2} , fish: {"orange": 2, "white": 1}}

Мне просто нужно, чтобы запрос был быстрым. Также будет 10 столбцов, а не 3.

Я искал вокруг, но единственный метод, который я нашел, это получить счетчик на один столбец, так что это похоже на

SELECT cat, count(cat) FROM my_table GROUP BY cat

Но что если мне нужны частоты для каждого столбца, выполнив 1 запрос вместо 1 запроса для каждого столбца.

Спасибо!

Ответы [ 2 ]

1 голос
/ 15 апреля 2020

Один метод использует наборы группировки:

select cat, dog, fish, count(*)
from t
group by grouping sets ( (cat), (dog), (fish) );

Если ваши типы столбцов совместимы, вы также можете использовать боковое соединение:

select v.colname, v.val, count(*)
from t cross join
     (values ('cat', cat), ('dog', dog), ('fish', fish)
     ) v(colname, val)
group by v.colname, val;
0 голосов
/ 15 апреля 2020

Вы можете отменить поворот с боковым соединением, а затем агрегировать:

select x.animal, x.color, count(*) cnt
from mytable t
cross join lateral (values('cat', cat), ('dog', dog), ('fish', fish)) x(animal, color)
group by x.animal, x.color
order by x.animal, x.color

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

animal | color  | cnt
:----- | :----- | --:
cat    | green  |   1
cat    | red    |   2
dog    | black  |   2
dog    | blue   |   1
fish   | orange |   2
fish   | white  |   1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...