sql - 在也被分组的列上聚合
问题描述
我知道有很多与分组/聚合等相关的困惑,我认为我对整个事情有相当不错的把握,直到我看到一些类似的东西
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,但关于特定实现的信息也会很有趣
解决方案
聚合函数的参数可以包括要聚合的键。
也就是说,计算每组中的行COUNT(*)
数的更常见方法是使用. 我会推荐:
SELECT A, SUM(B)
FROM T
GROUP BY A
HAVING COUNT(*) > 1;
使用有一点开销,COUNT(A)
因为A
需要NULL
在每一行中检查 的值。
推荐阅读
- hadoop-yarn - 在 EMR 中取消 YARN 步骤
- php - insertafter 数据卡在其上方的单元格中
- ruby-on-rails - ActiveRecord::SubclassNotFound:无效的单表继承类型:User::Admin 不是 User 的子类
- python - 我在 python 中的全局变量无法从它创建的 def 外部引用
- listview - 使用 List 在 cide 后面创建一个列表视图
- > 作为源和网格作为数据模板
- javascript - 如何根据屏幕大小调整输入的大小(由用户在弹出窗口中选择)
- sql - SQL 窗口函数 order by vs partition by。有什么区别?
- discord.js - 需要 Discord.JS 嵌入命令帮助
- angular - 无法读取未定义的属性“endsWith”
- amazon-web-services - 有没有办法确保按顺序运行 lambda