计算表中出现次数的最佳方法?

时间:2019-05-10 22:17:50

标签: sql postgresql

我有一张表,其中一些键值出现在一个或多个列中。每个值在每一行中可能出现零次或多次。如何有效地计算整个表中每个值的出现次数?

示例:

c1  | c2  | c3
----+-----+-----
A . | B . | C
A . | C . | D
E . | C . | B
D . | D . | A
C . | B . | B

所需结果:

A 3
B 4
C 4
D 3
E 1

供参考,表有6列,5万行和2000个不同的值。

2 个答案:

答案 0 :(得分:3)

一个想法是将所有值选择为一个并集,然后计数:

类似:

SELECT data, count(*) FROM (
SELECT col1 as data FROM table
UNION ALL
SELECT col2 as data FROM table
...
) GROUP BY data

答案 1 :(得分:1)

最好的方法是使用横向连接:

select col, count(*)
from t cross join lateral
     (values (col1), (col2), (col3)) v(col)
group by col;

这是最好的,因为源表只需要扫描一次,而不是每列一次。

相关问题