hive的分析函數
1、rollup:group by 的增強函數
實現根據部門號、工作職位求工資總和,根據部門求工資總和,查所有人的工資總和
通過group by 語句的增加來實現:
select deptno,job,sum(sal)
from emp
group by rollup(deptno,job);
語法:
group by rollup(a,b) = group by a,b
+
group by a
+
不分組
測試oracle
測試hive
2、over(開窗參數)開窗函數
本質:就是一個“分組函數”,可以返回多個值
參數:
unbounded:指定哪些數據進入窗口
preceding:在...之前,用法:unbounded preceding:表示:分組後的第一行
following:在...之後,用法:unbounded following:表示:分組後的最後一行
current row:分組後的當前行
舉例:求部門進行分組,求:員工號、姓名、部門號,薪水,每個部門的第一行到當前行的工資總和
select empno,ename,deptno,sal,
sum(sal)
over(partition by deptno order by sal
rows between unbounded preceding and current row )
from emp;
我認爲該語句其實是這樣
select empno,ename,deptno,sal from emp;這句sql語句可以查出所有的行,但是我還想使用開窗函數求出一個分組,
分組後的sum(sal)是分組後的第一行到當前行的合計sal之
所以使用到了over,參數中partition by設置了開窗條件(其實就是分組),order by 在窗口中排序,每行的計算格式
當然我們也可以把看到的窗口打亂使用窗外排序,但它計算的時候還是使用窗口來計算的
行號: Oracle中有一個僞列:rownum(一般不建議使用)
row_number():對部門進行分組,按照薪水排序,並顯示該員工在部門中的序號
select empno,ename,deptno,sal,
row_number() over(partition by deptno order by sal) 序號
from emp;
rank(): 考慮了重複的記錄,序號可能不連續
select empno,ename,deptno,sal,
rank() over(partition by deptno order by sal) 序號
from emp;
dense_rank():考慮了重複的記錄,序號連續
select empno,ename,deptno,sal,
dense_rank() over(partition by deptno order by sal) 序號
from emp;
lag:滯後,把某個列往後錯行
lead,提前,把某個列往前提行
按照薪水:
select empno,ename,deptno,sal,
lag(sal,2) over(partition by deptno order by sal) 滯後,
lead(sal,2) over(partition by deptno order by sal) 提前
from emp;
first_value:取分組後的第一行
last_value:取分組後的最後一行
select empno,ename,deptno,sal,
first_value(sal) over(partition by deptno order by sal
rows between unbounded preceding and unbounded following) 第一行,
last_value(sal) over(partition by deptno order by sal
rows between unbounded preceding and unbounded following) 最後一行
from emp;