【发布时间】:2021-02-09 04:46:29
【问题描述】:
我知道在分组/聚合等方面存在很多混淆,我认为我对整个事情有相当不错的掌握,直到我看到类似的东西
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,但有关特定实现的信息也会很有趣
【问题讨论】:
标签: sql group-by aggregate-functions having ansi-sql