【问题标题】:SQL: Efficient way to count and group results by like valueSQL:按相似值对结果进行计数和分组的有效方法
【发布时间】:2020-05-29 19:25:54
【问题描述】:

我有一张如下所示的表格:

+----+-------+
| 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 语句,但它看起来很乱。

【问题讨论】:

    标签: sql csv group-by presto


    【解决方案1】:

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

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

    如果您想要 distinct 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
    

    【讨论】:

      【解决方案2】:

      你可能需要一个包含所有可能出现在第二列中的字符的字符表。假设你确实有,你可以尝试加入方法:

      WITH letters AS (
          SELECT 'a' AS col1 UNION ALL
          SELECT 'b' UNION ALL
          SELECT 'c' UNION ALL
          ...
          SELECT 'z'
      )
      
      SELECT
          t1.col1,
          COUNT(t2.col2) AS count_id
      FROM letters t1
      LEFT JOIN yourTable t2
          ON ',' || t2.col2 || ',' LIKE '%,' || t1.col1 || ',%'
      GROUP BY
          t1.col1
      ORDER BY
         t1.col1;
      

      请注意,仅当col2 恰好包含我们要报告的所有字母时,接受的答案才有效。如果不是,则输出中将缺少信息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-04
        • 1970-01-01
        • 2022-08-10
        • 2022-01-13
        • 2020-05-26
        相关资源
        最近更新 更多