SQL Server:PARTITION BY和GROUP BY之间的区别

谁都会走 提交于 2020-03-11 21:47:10

多年来,我一直在使用GROUP BY来处理所有类型的聚合查询。 最近,我一直在反向设计一些使用PARTITION BY来执行聚合的代码。 在阅读我可以找到的关于PARTITION BY所有文档时,它听起来很像GROUP BY ,可能还添加了一些额外的功能? 它们是相同通用功能的两个版本,还是它们完全不同?


#1楼

据我所知,Partition By几乎与Group By相同,但有以下不同之处:

该组实际上对结果集进行分组,每组返回一行,这导致SQL Server只允许在SELECT列表中允许聚合函数或属于group by子句的列(在这种情况下,SQL Server可以保证有唯一的每组的结果)。

考虑例如MySQL允许在SELECT列表中具有未在Group By子句中定义的列,在这种情况下,每个组仍然返回一行,但是如果列没有唯一结果,则无法保证什么是输出!

但是使用Partition By,虽然函数的结果与Group By的聚合函数的结果相同,但仍然得到正常的结果集,这意味着每个底层行获得一行,而不是每行一行group,因此,SELECT列表中的每个组都可以包含不唯一的列。

因此,作为摘要,当需要每组输出一行时,分组依据是最佳的,当需要所有行但仍希望基于组的聚合函数时,分区依据是最佳的。

当然也可能存在性能问题,请参阅http://social.msdn.microsoft.com/Forums/ms-MY/transactsql/thread/0b20c2b5-1607-40bc-b7a7-0c60a2a55fba


#2楼

partition by实际上并没有汇总数据。 它允许您基于每个组重置某些内容。 例如,您可以通过在分组字段上进行分区并在该组中的行上使用rownum()来获取组内的序数列。 这会给你一些行为有点像标识列的东西,它会在每个组的开头重置。


#3楼

它们被用在不同的地方。 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不会影响返回的行数,但会更改窗口函数的结果计算方式。


#4楼

PARTITION BY是分析的,而GROUP BY是聚合的。 要使用PARTITION BY ,必须使用OVER子句包含它。


#5楼

PARTITION BY将结果集划分为分区。 窗口函数分别应用于每个分区,并为每个分区重新开始计算。

在此链接中找到: OVER Clause

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!