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;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

枣泥馅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值