【问题标题】:Aggregating on a column that is also being grouped on在也被分组的列上聚合
【发布时间】: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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 请注意,如果 A 有几个空值,则 count(A) vs count(*) 结果将不一样。
    • 除了 COUNT 之外的其他东西怎么样,如何解释“''HAVING SUM(A)>1'''?
    • 试试看,这是一个 DB Fiddle,其中已经填写了一些示例数据。db-fiddle.com/f/dTwXYie7ZfKKAjKWK6W1wH/0
    • @ColinHicks 。 . .这回答了被问到的问题。但SUM(A)A * COUNT(*) 相同。
    猜你喜欢
    • 1970-01-01
    • 2014-05-29
    • 2018-11-05
    • 2017-04-09
    • 1970-01-01
    • 2022-11-02
    • 2014-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多