如何在 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 |
+----------------+------------+
Category
是 Error
在 ':' 上拆分后的第一部分。
【问题讨论】:
【参考方案1】:假设:
之前的长度可以变化,您可以将substring
与strpos
结合使用来实现您的结果:
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)
【讨论】:
以上是关于如何在 PostgreSQL 中对列的一部分进行分组?的主要内容,如果未能解决你的问题,请参考以下文章
SonataAdminBundle 如何在列表视图中对列的值求和
有没有办法在oracle sql developer中对列的每个字段执行md5散列,并将结果散列存储在相应的列中(md5)