窗口函數及OVER子句(1):基礎

窗口函數及OVER子句(1):基礎

若覺得本文寫得還可以,請多多關注本人所作書籍《C++語法詳解》電子工業出版社

本文爲原創文章,轉載請註明出處,或註明轉載自“黃邦勇帥(原名:黃勇)

一、窗口的概念
1、窗口(window)是標準SQL中的術語,可理解爲是運算將要操作的行的集合,窗口與分組或分區是類似的,都是對錶中的行進行的一種劃分方法,分組由GROUP BY子句劃分,而窗口是用OVER子句劃分的,分組和窗口還有很多不同的地方,後文會作詳細介紹。需要注意的是,窗口的最終結果是一個集合,在SQL Server具體實現時,窗口是在基礎查詢的結果集上進行定義的,因此,窗口是基礎查詢結果集的一個子集。
2、窗口函數:使用OVER子句定義的窗口進行計算的函數,被稱爲窗口函數或開窗函數。這意味着,窗口函數的計算範圍(或作用範圍、作用域)是OVER子句定義的數據行集合(即窗口),SQL Server支持的窗口函數類型有:聚合函數、排序函數、分析函數和偏移函數、NEXT VALUE FOR 函數。

二、OVER子句定義窗口(即分區)的方法
1、以集合的思維思考問題
關係模型基於集合理論,因此,我們應以集合的思維來思考問題,而不是以常規的迭代思維來思考問題,集合中的元素是沒有順序的,這一點與迭代思維有很大的不同。使用迭代思維提取表中的行時,是按照一定的順序以迭代的方式逐行提取的,但對於關係模型而言,一張表是一個集合,表中的行沒有順序,在SQL Server中,唯一確保表中的行按特定順序輸出(或展示)的方法就是在查詢中使用ORDER BY子句。
2、注意:實際物理實現時,並不一定會以集合的方式來實現,但在語言層面(即T-SQL語言)和邏輯層面,應以集合的方式(沒有順序)來思考問題,而不是以迭代方式(以一定順序,每次一條)來思考問題,語言或邏輯層面與數據庫引擎的物理實現是沒有關係的,物理層的責任是正確地以儘可能快的方法來實現邏輯層的要求,因此,不同的數據庫引擎可使用不同的方法來實現邏輯層的要求。
3、OVER子句定義窗口的原理及其語法元素
1)、OVER子句由3個核心元素組成,即分區、排序和框架,但不是所有窗口函數都支持這3 個元素。OVER子句語法的一般形式如下(各元素的具體語法,詳見後文)
OVER ( [ PARTITION BY clause ] --分區元素
[ ORDER BY clause ] --排序元素
[ ROW or RANGE clause ] ) --框架元素
爲講解需要,此處先對PARTITION BY子句過濾的原理作一講解,其餘元素的具體講解,詳見後文。PARTITION BY子句用於對查詢結果集進行分區,其原理爲,只有在結果集的分區列中與當前行的分區列有相同值的行才進入窗口,其餘行被過濾掉
2)、OVER使用分區、排序和框架3個元素對窗口進行限制或過濾,如果OVER未對定義的窗口作限制(即OVER() ),則窗口包含查詢結果集中從頭開始的所有行
3)、OVER是對查詢結果集的一種限制或者過濾而不是分組。OVER子句使用分區、排序和框架元素對窗口進行限制或過濾,符合要求的行才能進入窗口,不符合要求的行會被過濾掉。
4)、對於查詢結果集中的每一行,OVER子句都會定義一個針對於該行的獨立窗口,也就是說,若查詢結果集有10行,就會爲這10行單獨定義10個獨立的窗口,理解這一點相當重要。
5)、窗口函數的窗口是在查詢結果集的基礎上定義的,而基礎查詢的結果集需要在SELECT階段纔會產生,即在FROM、WHERE、GROUP BY,以及HAVING階段之後才產生,這意味着,
 窗口是在對錶進行了表操作符(如聯接)、篩選(比如WHERE子句)、分組之後的結果集基礎之上定義的。
 窗口函數只能用於SELECT和ORDER BY子句中,因此,窗口函數的邏輯處理順序位於ORDER BY階段或者SELECT的選擇列表階段(DISTINCT階段之前,這對排序函數有影響,詳見後文)。注意:修改語句中(比如UPDATE)不能出現窗口函數,因爲修改語句不支持SELECT和ORDER BY子句。
4、本小節至第5小節,將以窗口聚合函數爲基礎進行講解,因此,本章不會單獨再對窗口聚合函數進行講解,下面爲窗口聚合函數的一些特點
 窗口聚合函數和分組聚合函數的功能是相同的,不同的是分組聚合函數的計算是通過分組查詢進行的,窗口聚合函數的計算是通過OVER子句定義的窗口進行的,也就是說,分組聚合函數的計算範圍是分組,而窗口函數的計算範圍是窗口。
 窗口聚合函數只需在分組聚合函數的後面加上OVER子句即可,比如SUM (…) OVER (…)即爲窗口聚合函數
 在SQL Server2012之後的窗口聚合函數才支持排序和框架子句。
 OVER 子句不能與 CHECKSUM 聚合函數結合使用

示例5.1:OVER子句定義窗口的原理(運行結果見圖5.2)
select a,b,c,d,sum( c ) OVER(partition by a) from T4

在這裏插入圖片描述
對示例的說明
1)、對於行(1, 2, 3, 4),PARTITION BY a表示當前行的分區列和查詢結果集的分區列爲a,當前行列a的值爲1,查詢結果集是表T4的所有行,因此,當前行(1, 2, 3, 4)的窗口就是在查詢結果集中列a的值爲1的行,其窗口爲行(1, 2, 3, 4),對該窗口的c列進行求和,其結果爲3
2)、行(5, 6, 2, 1)的窗口是查詢結果集中列a的值爲5的行,其窗口爲行(5, 6, 2, 1)和(5, 6, 11, 12),對該窗口的c列進行求和,其結果爲2 + 11=13
3)、行(5, 6, 11, 12)的窗口是(5, 6, 2, 1)和(5, 6, 11, 12),對該窗口的c列進行求和,其結果爲2 + 11=13
4)、行(4, 10, 1, 8)的窗口是(4, 10, 1, 8),對該窗口的c列進行求和,其結果爲1

作者:黃邦勇帥(原名:黃勇)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章