首页 > 解决方案 > 在也被分组的列上聚合

问题描述

我知道有很多与分组/聚合等相关的困惑,我认为我对整个事情有相当不错的把握,直到我看到一些类似的东西

SELECT A, SUM(B)
FROM T
GROUP BY A
HAVING COUNT(A)>1;

起初这让我感到困惑,因为它似乎在一个也被分组的列上执行聚合是多余的,因为根据定义,该组的值将是不同的。但是后来我想了想,如果聚合是在分组之前完成的,那么对于表中的重复值是有意义的。在我看来,它似乎更像是这样的查询

SELECT A, SUM(B)
FROM T
WHERE A in (SELECT A FROM T GROUP BY A HAVING COUNT(*)>1)
GROUP BY A;

与分组完成后每个组上的另一个选择运算符相反(因为对我来说这没有多大意义)。

所以我的问题是多方面的:被分组的元素是否可以包含在 HAVING 子句中?被分组的元素是否可以聚合(在 HAVING 子句或其他地方,如 SELECT 子句)?如果前面的陈述成立,我对这个操作意味着什么的理解是否正确?

注意:这个问题主要是关于标准(ansi)SQL,但关于特定实现的信息也会很有趣

标签: sqlgroup-byaggregate-functionshavingansi-sql

解决方案


聚合函数的参数可以包括要聚合的键。

也就是说,计算每组中的COUNT(*)数的更常见方法是使用. 我会推荐:

SELECT A, SUM(B)
FROM T
GROUP BY A
HAVING COUNT(*) > 1;

使用有一点开销,COUNT(A)因为A需要NULL在每一行中检查 的值。


推荐阅读