多年来,我一直在对所有类型的聚合查询使用GROUP BY。最近,我一直在逆向工程一些使用PARTITION BY来执行聚合的代码。
在阅读我能找到的所有关于PARTITION BY的文档时,它听起来很像GROUP BY,可能还添加了一些额外的功能。
它们是相同功能的两个版本还是完全不同的东西?
多年来,我一直在对所有类型的聚合查询使用GROUP BY。最近,我一直在逆向工程一些使用PARTITION BY来执行聚合的代码。
在阅读我能找到的所有关于PARTITION BY的文档时,它听起来很像GROUP BY,可能还添加了一些额外的功能。
它们是相同功能的两个版本还是完全不同的东西?
当前回答
小的观察。使用“partition by”动态生成SQL的自动化机制相对于“group by”要简单得多。对于“group by”,我们必须注意“select”列的内容。
对不起,我的英语不好。
其他回答
分区并不会实际卷起数据。它允许您在每个组的基础上重置一些东西。例如,通过对分组字段进行分区并对组中的行使用rownum(),可以获得组中的序数列。这使您的行为有点像在每个组的开头重置的标识列。
使用GROUP BY时,生成的行通常比输入的行少。
但是,当使用PARTITION BY时,得到的行数应该与传入的行数相同。
它们被用在不同的地方。GROUP BY修改整个查询,比如:
select customerId, count(*) as orderCount
from Orders
group by customerId
但是PARTITION BY只适用于窗口函数,比如ROW_NUMBER():
select row_number() over (partition by customerId order by orderId)
as OrderNumberForThisCustomer
from Orders
GROUP BY通常减少滚动返回的行数 他们计算每行的平均值或总和。 PARTITION BY不影响返回的行数,但是它 更改窗口函数结果的计算方式。
假设我们在表中有14条name列的记录
在小组由
select name,count(*) as totalcount from person where name='Please fill out' group BY name;
它将给出单行计数,即14
但是在除以
select row_number() over (partition by name) as total from person where name = 'Please fill out';
它将增加14行计数
PARTITION BY是分析的,GROUP BY是聚合的。为了使用PARTITION BY,你必须用OVER子句来包含它。