【问题标题】:How to group on part of a column in PostgreSQL?如何在 PostgreSQL 中对列的一部分进行分组?
【发布时间】:2016-08-08 20:02:54
【问题描述】:

我在 PostgreSQL 中有下表tableA

+-------------+-------------------------+
| OperationId |         Error           |
+-------------+-------------------------+
|           1 | MajorCategoryX:DetailsP |
|           2 | MajorCategoryX:DetailsQ |
|           3 | MajorCategoryY:DetailsR |
+-------------+-------------------------+

如何对 MajorErrorCategory 进行分组以便获得以下信息?

+----------------+------------+
|    Category    | ErrorCount |
+----------------+------------+
| MajorCategoryX |          2 |
| MajorCategoryY |          1 |
+----------------+------------+

CategoryError 在 ':' 上拆分后的第一部分。

【问题讨论】:

    标签: sql postgresql aggregation string-matching


    【解决方案1】:

    假设: 之前的长度可以变化,您可以将substringstrpos 结合使用来实现您的结果:

    SELECT 
        SUBSTRING(error, 0, STRPOS(error, ':')) AS Category,     
        COUNT(*) AS ErrorCount
    FROM t
    GROUP BY SUBSTRING(error, 0, STRPOS(error, ':'))
    

    Sample SQL Fiddle

    如果您不想重复函数调用,当然可以将该部分包装在 suquery 或公用表表达式中。

    【讨论】:

      【解决方案2】:

      split_part() 似乎最简单(as @ub3rst4r mentioned):

      但你不需要子查询:

      SELECT split_part(error, ':', 1) AS category, count(*) AS errorcount 
      FROM   tbl
      GROUP  BY 1;
      

      而且count(*)count(<expression>) 稍快。

      GROUP BY 1 是对第一个 SELECT 项的位置引用,也是较长表达式的便捷简写。示例:

      【讨论】:

        【解决方案3】:

        这是我使用子查询和split_part 函数得出的结论:

        SELECT *, COUNT(ErrorSplit) 
        FROM (
          SELECT split_part(Error, ':', 1) AS ErrorSplit
          FROM tableA
        ) AS tableSplit
        GROUP BY ErrorSplit;
        

        输出:

           errorsplit  | count
        ----------------------
        MajorCategoryX |  2
        MajorCategoryY |  1
        

        SQL Fiddle

        【讨论】:

          【解决方案4】:

          考虑substring() 函数:

          SELECT substring(TableName.Error,1,14) AS Category, 
                 Count(*) As ErrorCount
          FROM TableName
          GROUP BY substring(TableName.Error,1,14) 
          

          【讨论】:

            猜你喜欢
            • 2021-06-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-03-29
            • 2012-01-29
            • 2015-04-07
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多