2013年12月26日 星期四

SQL 2012 函數 OVER 說明

OVER ( 
       [ <PARTITION BY clause> ]
       [ <ORDER BY clause> ] 
       [ <ROW or RANGE clause> ]
      ) 
PARTITION BY 欄位
                        將Select查詢結果集依欄位內容作群組分類。(例 部門欄位 依各部門作群組再做計算)
ORDER BY 欄位 ASC | DESC
            依PARTITION 定義群組結果集做邏輯順序,沒設定PARTITION的話就是全部
ROWS | RANGE  CURRENT ROW...
                       依PARTITION 定義與ORDER BY 的資料範圍,再設定指定的範圍詳下列說明
UNBOUNDED PRECEDING
第一筆資料,指的是PARTITION 與 ORDER所限定的範圍
<指定不帶正負號的值> PRECEDING
從目前資料往前幾筆。 RANGE 不允許這項指定。
CURRENT ROW
目前這一筆,可以當這一筆開始或到這一筆結束。
BETWEEN <開始筆數 > AND <結束筆數 >
與 ROWS 或 RANGE 一起使用,以指定計算的筆數視 上限不能小於下限。
UNBOUNDED FOLLOWING
最後一筆資料,指的是PARTITION 與 ORDER所限定的範圍
<指定不帶正負號的值> FOLLOWING
從目前資料往後幾筆。 RANGE 不允許這項指定。
備註
1.在含有一個 FROM 子句的單一查詢中,可以使用一個以上的視窗函數。 每個函數的 OVER 子
句在進行資料分割和進行排序時,都不一樣。
2.如未指定 PARTITION BY,此函數會將查詢結果集的所有資料列視為單一群組。
3.如果未指定 ORDER BY,則將整個資料分割用於視窗框架。 這只適用於不需要 ORDER BY 子
句的函數。 如果未指定 ROWS/RANGE,但指定了 ORDER BY,則將 
RANGE UNBOUNDED PRECEDING AND CURRENT ROW 當做視窗框架的預設值。 
這只適用於可以接受選擇性 ROWS/RANGE 指定的函數。 
例如,排名函數不能接受 ROWS/RANGE,因此,即使存在 ORDER BY 而不存在 ROWS/RANGE
,這個視窗框架依然不適用。
4.如果指定了 ROWS/RANGE 而且 <之前的視窗框架> 用於 <視窗框架範圍> (簡短語法),
則這個指定會用於視窗框架邊界開始點,而 CURRENT ROW 則用於邊界結束點。 
例如,“ROWS 5 PRECEDING” 等於 “ROWS BETWEEN 5 PRECEDING AND CURRENT ROW”。

沒有留言:

張貼留言