hive的分析函數

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;

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