我有一张表,其中一些键值出现在一个或多个列中。每个值在每一行中可能出现零次或多次。如何有效地计算整个表中每个值的出现次数?
示例:
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个不同的值。
答案 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;
这是最好的,因为源表只需要扫描一次,而不是每列一次。