我试图用集合来思考数据但是对集合函数有一些疑问。
这是wiki的定义
聚合函数是一个函数 从a返回单个值 输入值的集合,例如a 设置
所以,例如,
select c.id, c.user_id, c.name, c.created_at, count(c.id) from collections c;
可以想到“count从collection c set返回单个值”
select c.id, c.user_id, c.name, c.created_at, count(c.id)
from collections c group by c.user_id
可以想到“count从集合(c)集中的每个子集(从分组中设置)返回单个值”
我的问题是,我如何知道计数返回的“单个值”,在这种情况下,集合(c)集合或每个“分组依据”子集。
考虑一个更复杂的查询(TOP N PER GROUP)
select c.id, c.user_id, c.name, c.created_at
from collections c
left join collections co on c.user_id = co.user_id and c.name <=co.name
group by c.user_id, c.name
having count(*)<=2;
这里设置group by(c.user_id)有自己的子集(c.name),我怎么知道count(*)将返回什么(整个集合的单个值(只有一个) rol)?或每个子集的单个值(c.user_id)或每个子集的单个值(c.name)?)
答案 0 :(得分:1)
对于执行聚合工作的任何查询,您需要按正确的字段进行分组。
第一个查询应该失败,因为c.id,c.user_id,c.name和c.created_at字段未使用GROUP BY分组。
同样,第二个查询也会失败,因为只有第一个字段被分组。
要使最后一个查询起作用,您可能还需要在GROUP BY中包含该ID。
聚合函数仅在SELECT子句的所有非聚合元素(例如,c.id,c.user_id等)表示正在聚合的组(即包含在GROUP BY子句中)时有效。 / p>
答案 1 :(得分:1)
GROUP BY不会生成多个集合。它成为一个;在你的情况下,它由对(c.user_id,c.name)分组。任何具有相同行(c.user_id,c.name)的行都放在一个组中,这些是count count(*)将要处理的组。
答案 2 :(得分:0)
聚合函数在计算之后计算 a)加入 b)根据where子句过滤行。
一旦完成连接并根据查询中的where子句过滤了行,就会对您的数据集进行Picturize。 group by子句现在将根据where子句中指定的列将数据集细分为不同的组。给定组中的所有行对于where子句中指定的所有列都具有相同的值。
将原始数据集中的行分类为组后,您只能查询(即选择列)组中常见的行。在您按c.user_id分组的第二个示例中,集合表中的每个不同user_id将有一个组。如果查询中没有“HAVING”子句,则查询将为每个组返回一行。您可以将每个组视为(仅认为)包含列的行。这些列将表示整个组共有的内容,如count(*),SUM,MAX,MIN等。组形成的列名对于每个组也是相同的!
having子句类似于group的where子句。它过滤掉了不满足having子句中谓词的整个组。