【SQL学习笔记】排名开窗函数,聚合开窗函数(Over by)

王朝学院·作者佚名  2016-05-25
窄屏简体版  字體: 小  |  中  |  大  |  超大  

【SQL学习笔记】排名开窗函数,聚合开窗函数(Over by)

处理一些分组后,该组按照某列排序后 ,取其中某条完整数据的问题。 或 按照其中不同列分组后的聚合 比如 sum,avg之类。

MSDN上语法:

Ranking Window Functions < OVER_CLAUSE > :: = OVER ( [ PARTITION BY value_exPRession , ... [ n ] ] <ORDER BY_Clause> )Aggregate Window Functions < OVER_CLAUSE > :: = OVER ( [ PARTITION BY value_expression , ... [ n ] ] )

一共两种应用场景。

场景1:

按某列进行重新分区,然后区内排序后,取其中某条数据。例:

1 select * from ( 2 select id,name,counts,row_number() over(partition by name order by counts desc) rn 3 from Table1 4 ) t where t.rn <=1

含义:

over(partition by name order by counts desc)

意思是 把表Table1 中的数据按照 name列进行分区,每个区按照counts进行排序。

row_number() over(partition by name order by counts desc) rn

意思是 每个区排序后 取到其中排序后的序列号 。并起名字rn

select * from ( select id,name,counts,row_number() over(partition by name order by counts desc) rn from Table1 ) t where t.rn =1

意思是 每个分区排序后,获取第一行数据,其他行舍弃。

场景二:

结合聚合函数,获取分区聚合后的值,性能比子查询还要高。

1 SELECT SalesOrderID, ProductID, OrderQty2 ,SUM(OrderQty) OVER(PARTITION BY SalesOrderID) AS 'Total'3 ,AVG(OrderQty) OVER(PARTITION BY SalesOrderID) AS 'Avg'4 ,COUNT(OrderQty) OVER(PARTITION BY SalesOrderID) AS 'Count'5 ,MIN(OrderQty) OVER(PARTITION BY SalesOrderID) AS 'Min'6 ,MAX(OrderQty) OVER(PARTITION BY SalesOrderID) AS 'Max'7 FROM Sales.SalesOrderDetail 8 WHERE SalesOrderID IN(43659,43664);

这段是MSDN上的,这的意思是按不同的需要,重新分区(这里是按照SalesOrderID字段分区),获取相应数据。聚合函数就不多说了。。亮点是,比子查询性能高(MSDN说的)。

MSDN的链接地址:https://msdn.microsoft.com/zh-cn/library/ms189461(v=sql.105).aspx

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航