處理一些分組后,該組按照某列排序后 ,取其中某條完整數據的問題。 或 按照其中不同列分組后的聚合 比如 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
新聞熱點
疑難解答