我們先準備資料庫、表和數據
開窗分析函數相對於mysql中的聚合函數區別是:分析函數是基於某個組多個數據進行計算聚合,而聚合函數是每個組返回一行數據。
官網
我們先做個例子感受下:
要求: 查詢部門編號為10的所有的員工,按照薪資降序排序
Mysql實現:select empno,ename,deptno,sal from emp where deptno=10 order by sal desc;
如果要求是:將每個部門薪資最高的那個人的薪資顯示在最後一行。
select empno,ename,deptno,sal, max(sal) over(partition by deptno order by sal desc) as sal_max from emp;
我們看官網這個位置
我們來解釋裡面的概念
當前有一個數據
CURRENT ROW
UNBOUNDED PRECEDING 初始行
PRECEDING 前一行
CURRENT ROW 當前行
FOLLOWING 後一行
UNBOUNDED FOLLOWING 最後一行
所以上面的語句我們變動下
select empno,ename,deptno,sal, max(sal) over(partition by deptno order by sal desc ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) as sal_max from emp;
可以控制窗口大小
結果是一樣的,但是窗口大小我們做了變化
我們準備數據
創建一個表
載入數據
load data local inpath '/data/hivetest/anal.txt' into table analytical;
語句1:
我們看結果
語句2
語句3
語句4
語句5
語句6
已上是窗口和基本語句的使用。
我們來看ROW_NUMBER
將每個部門薪資最高的那個人的薪資降序排序並且顯示唯一的編號ROW_NUMBER
獲取每個部門薪資最高的前兩位(嵌套子查詢)