它提供汇总数据而不会卷起来
即假设我想要返回销售区域的相对位置
使用PARTITION BY,我可以返回给定区域的销售额 的 和 强> 同一行中所有销售区域的最大金额。
这意味着您将拥有重复数据,但它可能适合最终消费者,因为数据已经聚合但没有数据丢失 - 就像GROUP BY的情况一样。
partition by 实际上并没有汇总数据。它允许您基于每个组重置某些内容。例如,您可以通过在分组字段上进行分区并使用来获取组内的序数列 rownum() 在该组内的行。这会给你一些行为有点像标识列的东西,它会在每个组的开头重置。
partition by
rownum()
小观察。使用'partition by'动态生成SQL的自动化机制相对于'group by'实现起来要简单得多。在“分组依据”的情况下,我们必须注意“选择”列的内容。
对不起我的英语不好。
假设我们有14条记录 name 表中的列
name
在 group by
group by
select name,count(*) as totalcount from person where name='Please fill out' group BY name;
它将以单行计数,即14
但在 partition by
select row_number() over (partition by name) as total from person where name = 'Please fill out';
它将增加14行计数
它们被用在不同的地方。 group by 修改整个查询,如:
select customerId, count(*) as orderCount from Orders group by customerId
但 partition by 只是努力 一个窗口功能 , 喜欢 row_number :
row_number
select row_number() over (partition by customerId order by orderId) as OrderNumberForThisCustomer from Orders
一个 group by 通常会通过滚动它们并计算每行的平均值或总和来减少返回的行数。 partition by 不会影响返回的行数,但会改变计算窗口函数结果的方式。
我们可以举一个简单的例子
我们有一个名为的表 TableA 具有以下值。
TableA
id firstname lastname Mark ------------------------------------------------------------------- 1 arun prasanth 40 2 ann antony 45 3 sruthy abc 41 6 new abc 47 1 arun prasanth 45 1 arun prasanth 49 2 ann antony 49
的 通过...分组 强>
可以在SELECT语句中使用SQL GROUP BY子句进行收集 跨多个记录的数据,并将结果分组一个或多个 列。 换句话说,GROUP BY语句与结合使用 聚合函数将结果集分组为一个或多个 列。
可以在SELECT语句中使用SQL GROUP BY子句进行收集 跨多个记录的数据,并将结果分组一个或多个 列。
换句话说,GROUP BY语句与结合使用 聚合函数将结果集分组为一个或多个 列。
的 句法 : 强>
SELECT expression1, expression2, ... expression_n, aggregate_function (aggregate_expression) FROM tables WHERE conditions GROUP BY expression1, expression2, ... expression_n;
我们可以在表格中应用GroupBy
select SUM(Mark)marksum,firstname from TableA group by id,firstName
结果:
marksum firstname ---------------- 94 ann 134 arun 47 new 41 sruthy
在我们的实际表中,我们有7行,当我们按ID应用group时,服务器根据id对结果进行分组
简单来说
这里group by通常会减少滚动返回的行数 他们起来并计算每一行的总和。
的 分区 强>
在去分区之前
让我们看看OVER条款
的 根据MSDN定义 强>
OVER子句定义一个窗口或用户指定的行集 查询结果集。然后,窗口函数计算每行的值 在窗口。您可以将OVER子句与函数一起使用来计算 汇总值,如移动平均线,累计总量, 运行总计,或每组结果的前N个。
partition by不会减少返回的行数
我们可以在示例表中应用分区
select SUM(Mark) OVER (PARTITION BY id) AS marksum, firstname from TableA
marksum firstname ------------------- 134 arun 134 arun 134 arun 94 ann 94 ann 41 sruthy 47 new
看看它会对行进行分区的结果,并导致所有行都不像group by。
分区 将结果集划分为分区。窗口函数分别应用于每个分区,并为每个分区重新开始计算。
在此链接中找到: 超越条款
据我所知,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 。
-- BELOW IS A SAMPLE WHICH OUTLINES THE SIMPLE DIFFERENCES -- READ IT AND THEN EXECUTE IT -- THERE ARE THREE ROWS OF EACH COLOR INSERTED INTO THE TABLE -- CREATE A database called testDB -- use testDB USE [TestDB] GO -- create Paints table CREATE TABLE [dbo].[Paints]( [Color] [varchar](50) NULL, [glossLevel] [varchar](50) NULL ) ON [PRIMARY] GO -- Populate Table insert into paints (color, glossLevel) select 'red', 'eggshell' union select 'red', 'glossy' union select 'red', 'flat' union select 'blue', 'eggshell' union select 'blue', 'glossy' union select 'blue', 'flat' union select 'orange', 'glossy' union select 'orange', 'flat' union select 'orange', 'eggshell' union select 'green', 'eggshell' union select 'green', 'glossy' union select 'green', 'flat' union select 'black', 'eggshell' union select 'black', 'glossy' union select 'black', 'flat' union select 'purple', 'eggshell' union select 'purple', 'glossy' union select 'purple', 'flat' union select 'salmon', 'eggshell' union select 'salmon', 'glossy' union select 'salmon', 'flat' /* COMPARE 'GROUP BY' color to 'OVER (PARTITION BY Color)' */ -- GROUP BY Color -- row quantity defined by group by -- aggregate (count(*)) defined by group by select count(*) from paints group by color -- OVER (PARTITION BY... Color -- row quantity defined by main query -- aggregate defined by OVER-PARTITION BY select color , glossLevel , count(*) OVER (Partition by color) from paints /* COMPARE 'GROUP BY' color, glossLevel to 'OVER (PARTITION BY Color, GlossLevel)' */ -- GROUP BY Color, GlossLevel -- row quantity defined by GROUP BY -- aggregate (count(*)) defined by GROUP BY select count(*) from paints group by color, glossLevel -- Partition by Color, GlossLevel -- row quantity defined by main query -- aggregate (count(*)) defined by OVER-PARTITION BY select color , glossLevel , count(*) OVER (Partition by color, glossLevel) from paints
PARTITION BY 是分析的,而 GROUP BY 是聚合的。为了使用 PARTITION BY ,你必须包含它 OVER条款 。
PARTITION BY
GROUP BY