開窗函式用於為行定義一個視窗(這裡的視窗是指運算將要操作的行的集合),它對一組值進行操作,不需要使用GROUP BY子句對數據進行分組,能夠在同一行中同時返回基礎行的列和聚合列。
基本介紹
- 中文名:開窗函式(資料庫函式)
- 外文名:Analytical Functions
- 領域:計算機
- 適用範圍:資料庫
- 分類:資料庫函式
開窗函式與聚合函式計算方式一樣,開窗函式也是對行集組進行聚合計算,但是它不像普通聚合函式那樣每組只返回一個值,開窗函式可以為每組返回多個值。
開窗函式的語法為:over(partition by 列名1 order by 列名2 ),括弧中的兩個關鍵字partition by 和order by 可以只出現一個。over() 前面是一個函式,如果是聚合函式,那么order by 不能一起使用。
開窗函式主要分為以下兩類:
視窗函式OVER()指定一組行,開窗函式計算從視窗函式輸出的結果集中各行的值。
開窗函式不需要使用GROUP BY就可以對數據進行分組,還可以同時返回基礎行的列和聚合列。
1.排名開窗函式
ROW_NUMBER、DENSE_RANK、RANK屬於排名函式。
排名開窗函式可以單獨使用ORDER BY 語句,也可以和PARTITION BY同時使用。
PARTITION BY用於將結果集進行分組,開窗函式套用於每一組。
ORDER BY 指定排名開窗函式的順序,在排名開窗函式中必須使用ORDER BY語句。
ROW_NUMBER()為每一組的行按順序生成一個連續序號。
RANK()也為每一組的行生成一個序號,與ROW_NUMBER()不同的是如果按照ORDER BY的排序,如果有相同的值會生成相同的序號,並且接下來的序號是不連序的。例如兩個相同的行生成序號2,那么接下來會生成序號4。
DENSE_RANK()和RANK()類似,不同的是如果有相同的序號,那么接下來的序號不會間斷。也就是說如果兩個相同的行生成序號2,那么接下來生成的序號還是3。
2.聚合開窗函式
很多聚合函式都可以用作視窗函式的運算,如SUM、AVG、MAX、MIN、COUNT。
聚合開窗函式只能使用PARTITION BY子句,ORDER BY不能與聚合開窗函式一同使用。