Window Function 包含了 4 個大類。分別是:
1 - Rank Function
2 - Aggregate Function
3 - Offset Function
4 - Distribution Function.
1 - Rank Function 估計是平常用到最多的一類 window Function.
1.1 Rank() Over()
1.2 Row_Number() Over()
1.3 Dense_Rank() Over()
1.4 NTILE(N) Over()
注意點
這四個函數,要注意的地方有兩點:
a. Rank() Over() 與 Row_Number() Over() :
兩者唯一的區別,就在於Row_Number() Over() 真正實現了相同條件的兩條或者多條記錄是用唯一值來區別的
b. Rank() Over() 與 Dense_Rank() Over() :
這兩者的區別,在於他們對位於相同排名之後的名次,是接着相同排名的連續數(Rank) 還是相隔 N 個相同記錄個數之後的連續數(Dense_Rank)。
所以 Rank 出來的結果都是連續數字,而 Dense_Rank 出來的結果有可能有跳格數。
例子
第一種,我們平常用 Row_Number() 加 Top (N) 來實現 :
select top(100) *
from ( select
OrderId
, OrderMonth
, OrderAmount
, Row_Number() Over(
OrderBy OrderAmount DESC)
AS Amt_Order
from FctSales) tmp
Where Amt_Order between 2000 and 3000
2 - Aggregate Function. 用於聚合數據
2.1 - Sum() Over()
2.2 - Count() Over()
2.3 - AVG() Over()
2.4 - MIN() Over()
2.5 - MAX() Over()
在使用 Aggregation 函數的時候,唯一要注意的地方就是 Order 子句。
function_name(<arguments>) Over(
[ <window partition clause>]
[ <window Order clause>
[ <window frame clause>]
])
Over::
Over(
[ <PARTITION BY clause> ]
[ <ORDER BY clause> ]
[ <ROW or RANGE clause> ]
)
<window frame clause>::窗口中的窗口
ROWS | RANGE
BETWEEN
UNBOUNDED PRECDEDING |
<N> PRECEDING |
<N> FOLLOWING |
CURRENT ROW
AND
UNBOUNDED FOLLOWING |
<N> PRECEDING |
<N> FOLLOWING |
CURRENT ROW
舉一個例子:
select custid
, ordermonth
, ordervolume
, sum(ordervolume)
over( partition by custid
order by ordermonth asc
rows between
unbounded preceding
and current row)
as cumulatedVolume
from FctSales
統計了截止到目前爲止,每一天的累計總量。
3 - Offset Function:定位記錄
3.1 Lead()
3.2 LAG()
3.3 First_Value()
3.4 Last_Value()
3.5 Nth_Value()
這一類比較好理解,根據當前的記錄,獲取前後 N 條數據。
4 - Distribution Function: 分佈函數
4.1- PERCENT_RANK()
4.2 - CUME_DIST()
4.3 - PERCENT_COUNT()
4.4 - PERCENT_DISC()