为啥聚合函数会限制记录
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 的第三个问题吗?以上是关于为啥聚合函数会限制记录的主要内容,如果未能解决你的问题,请参考以下文章