語法:
分析函數 over(partition by 分組列 order by 排序列 rows between 開始位置 and 結束位置)
常用分析函數:
-
聚合類
avg()、sum()、max()、min() -
排名類
row_number() 按照值排序時產生一個自增編號,不會重複
rank() 按照值排序時產生一個自增編號,值相等時會重複,會產生空位
dense_rank() 按照值排序時產生一個自增編號,值相等時會重複,不會產生空位 -
其他類
lag(列名,往前的行數,[行數爲null時的默認值,不指定爲null])
lead(列名,往後的行數,[行數爲null時的默認值,不指定爲null])
ntile(n) 把有序分區中的行分發到指定數據的組中,各個組有編號,編號從1開始,對於每一行,ntile返回此行所屬的組的編號 -
注意點:
- over()函數中的分區、排序、指定窗口範圍,可組合使用也可以不指定,根據不同的業務場景需求結合使用
- over()函數中如果不指定分區,窗口大小默認針對查詢產生的所有數據,如果指定了分區,窗口大小針對每個分區的數據
- over()函數中的窗口範圍說明:
current row:當前行
unbounded:起點,unbounded preceding 表示從前面的起點, unbounded following表示到後面的終點
n preceding :往前n行數據
n following:往後n行數據
指定一個窗口邊界:rows between+可選項+and+可選項 or range between+可選項+and+可選項
rows between CURRENT ROW | UNBOUNDED PRECEDING | [num] PRECEDING and UNBOUNDED FOLLOWING | [num] FOLLOWING| CURRENT ROW
或
range between [num] PRECEDING and [num]FOLLOWING
保姆級翻譯:
CURRENT ROW ==>current row當前行
UNBOUNDED PRECEDING ==>unbounded preceding 第一行或則說首行
[num] PRECEDING ==> [num] preceding 前幾行
UNBOUNDED FOLLOWING ==>unbounded following 最後一行
[num] FOLLOWING ==>[num] following 後幾行
用圖表示如下:
ROWS是物理窗口,從行數上控制窗口的尺寸的;
RANGE是邏輯窗口,從列值上控制窗口的尺寸。這個比較難理解,但說白了就簡單了,具體解釋如下面栗子1.
結合order by子句使用,如果在order by子句後面沒有指定窗口子句,則默認爲:range between unbounded preceding and current row 或則是 rows between unbounded preceding and current row
舉例1:詳細內容請點鏈接看 hive sql經典面試題
後續再添加上案例...