首页 > 解决方案 > 计算每列中字符串的出现次数(Postgres)

问题描述

所以我有一个像这样结构简单的数据库


  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 个查询来获得每列的频率怎么办。

谢谢!

标签: sqlpostgresqlperformance

解决方案


一种方法使用分组集:

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;

推荐阅读