一篇搞定hive窗口函數

語法:

分析函數 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經典面試題

後續再添加上案例...

 

 

 

 

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