为啥聚合函数会限制记录

Posted

技术标签:

【中文标题】为啥聚合函数会限制记录【英文标题】:why are aggregate functions limiting records为什么聚合函数会限制记录 【发布时间】:2012-05-14 12:09:53 【问题描述】:

这听起来应该很愚蠢,但我不明白为什么聚合函数将返回的记录限制为 1。除了任何实际原因之外,这只是为了知道。

id
1 
2
3
4

现在SELECT id FROM table 产生

id
1 
2
3
4

如果我这样做 SELECT id, id, 1 AS p FROM table 它会给

id    id p
1     1  1
2     2  1
3     3  1
4     4  1

所以接下来我假设SELECT id, MAX(2) AS p FROM table 产生

id   p
1    2
2    2
3    2
4    2

但这实际上给出了:

id   p
1    2

1) 为什么聚合函数会出现这种情况,却没有给出我的预期结果?

2) 我在 mysql 和 SQLite 中发现了这一点。所有数据库的响应都一样吗?

3) 出于好奇让我问一下,我如何查询以获得这样的视图:

id   max(id)
1    4
2    4
3    4
4    4

【问题讨论】:

【参考方案1】:

1) 您无法执行此表达式,因为 ID 不在聚合函数中。只有当它们是选择中的唯一列时,才能使用聚合函数。这是因为它们返回单个值,而其他列大多返回不止一行。

2) 我在 Access 中尝试过,但出现错误。 (ID 不在聚合函数中......)。我还没有在其他数据库系统上尝试过。

3) 您可以通过在语句末尾添加 GROUP BY ID 来获得结果。这告诉系统您要在每个 ID 实例上使用聚合函数的每个结果。这使您可以在聚合函数之外使用 ID。

【讨论】:

您的第三点无效,因为它没有给出我发布的输出,而是给出了 (1,1), (2,2), .... 此查询link 产生此结果link。这看起来与您想要的结果完全一样。 图片中的查询可以,但我这里的查询是SELECT id, max(id)。这有区别,你能相应地回答吗? 哦,你是对的! max(id) 的查询是:SELECT ID, (SELECT MAX(ID) FROM Tab1) FROM Tab1;【参考方案2】:

对 1) 的规范答案是:这就是聚合和 group by 的定义和工作方式。

re 3) 在大多数现代 DBMS(只是不在 MySQL 和 SQLite 中)中,您可以这样做:

select id, 
       max(id) over ()
from your_table;

这将完全返回您的预期。

要在 MySQL 中获得您想要的内容,您需要使用子选择:

select id, 
       (select max(id) from your_table)
from your_table;

【讨论】:

@nawfal:它被称为窗口函数,可以做很多很酷的事情。 为什么连mysql和lite都不执行? @nawfal:因为这两个不支持窗口函数。 哎呀,我读了in most modern DBMS (not just in MySQL and SQLite) ,而它是in most modern DBMS (just not in MySQL and SQLite) :) 你知道如何回答我关于 MySQL 和 SQLite 的第三个问题吗?

以上是关于为啥聚合函数会限制记录的主要内容,如果未能解决你的问题,请参考以下文章

为啥聚集函数不能出现在where子句中

为啥聚合函数不能放在where后面?

为啥不能再where语句中直接使用聚合函数

为啥不能在单个 SELECT 中混合聚合值和非聚合值?

为啥 CROSS APPLY 与列和聚合函数需要 Group by

为啥 SQL 中没有 PRODUCT 聚合函数?