首页 > 解决方案 > SQL:按相似值对结果进行计数和分组的有效方法

问题描述

我有一个看起来像这样的表:

+----+-------+
| id | col2  |
+----+-------+
|  1 | a     |
|  2 | b     |
|  3 | ,b    |
|  4 | c     |
|  5 | d,a   |
|  6 | e,a,b |
+----+-------+

查询它并返回以下内容的最有效方法是什么?

+------+----------+
| col1 | count_id |
+------+----------+
| a    |        3 |
| b    |        3 |
| c    |        1 |
| d    |        1 |
| e    |        1 |
+------+----------+

我正在考虑使用case when语句,但它似乎很乱。

标签: sqlcsvgroup-bypresto

解决方案


在 Presto 中,您可以将分隔列表拆分为一个数组,然后取消嵌套该数组。这会为每个列表中的每个元素提供一条记录。剩下的只是聚合:

select s.colx, count(*) cnt 
from mytable t
cross join unnest(split(t.col2, ',')) as s(colx)
group by s.colx

如果您想要不同 ids 的计数(如果分隔列表中有重复项):

select s.colx, count(distinct t.id) cnt 
from mytable t
cross join unnest(split(t.col2, ',')) as s(colx)
group by s.colx

推荐阅读