如何在 PostgreSQL 中对列的一部分进行分组?

Posted

技术标签:

【中文标题】如何在 PostgreSQL 中对列的一部分进行分组?【英文标题】:How to group on part of a column in 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 在 ':' 上拆分后的第一部分。

【问题讨论】:

【参考方案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):

Cut string after first occurrence of a character

但你不需要子查询:

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

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

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

Select first row in each GROUP BY group?

【讨论】:

【参考方案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) 

【讨论】:

以上是关于如何在 PostgreSQL 中对列的一部分进行分组?的主要内容,如果未能解决你的问题,请参考以下文章

SonataAdminBundle 如何在列表视图中对列的值求和

如何在 Postgresql 中对总和进行排名?

根据每个值对列的值进行分组[重复]

有没有办法在oracle sql developer中对列的每个字段执行md5散列,并将结果散列存储在相应的列中(md5)

iview中对列标题头进行格式渲染render

如何在 SQL Server 中按日期列排序的组中对列进行排名