Hive什么时候可以用别名?

举个例子,求各部门工资和总工资的比例
1 首先求各部门工资以及总工资

select deptno,
       sum(sal) over (distribute by deptno) `d_dal`,
       sum(sal) over() `total_sal`
from tb_emp;

2 求比例
如下写法是错误的,此时还不能用别名

select deptno,
       sum(sal) over (distribute by deptno) `d_sal`,
       sum(sal) over() `total_sal`,
       d_sal/total_sal
from tb_emp;

想要用别名,必须嵌套一层,如下是可以的,因为相当于子查询保存起来,后面就可以用了

with a as (select deptno,
                  sum(sal) over (distribute by deptno) `d_sal`,
                  sum(sal) over ()                     `total_sal`
           from tb_emp)
select deptno,
       d_sal,
       total_sal,
       round(d_sal / total_sal, 2) `per`
from a
;

+------+-----+---------+----+
|deptno|d_sal|total_sal|per |
+------+-----+---------+----+
|30    |9400 |29025    |0.32|
|30    |9400 |29025    |0.32|
|30    |9400 |29025    |0.32|
|30    |9400 |29025    |0.32|
|30    |9400 |29025    |0.32|
|30    |9400 |29025    |0.32|
|20    |10875|29025    |0.37|
|20    |10875|29025    |0.37|
|20    |10875|29025    |0.37|
|20    |10875|29025    |0.37|
|20    |10875|29025    |0.37|
|10    |8750 |29025    |0.3 |
|10    |8750 |29025    |0.3 |
|10    |8750 |29025    |0.3 |
|NULL  |NULL |29025    |NULL|
+------+-----+---------+----+

如果不想嵌套,可以如下,就是不能用别名,但是这样的话 sum(sal) over()会不会计算两次,影响效率呢?

测试一下,如下sql用时30 s 279 ms,上面用别名的耗时 33 s 612 ms,可以看出并不影响效率

select deptno,
        sum(sal) over (distribute by deptno) `d_sal`,
        sum(sal) over() `total_sal`,
        round((sum(sal) over (distribute by deptno))/(sum(sal) over()),2) `per`
from tb_emp;
;
+------+-----+---------+----+
|deptno|d_sal|total_sal|per |
+------+-----+---------+----+
|30    |9400 |29025    |0.32|
|30    |9400 |29025    |0.32|
|30    |9400 |29025    |0.32|
|30    |9400 |29025    |0.32|
|30    |9400 |29025    |0.32|
|30    |9400 |29025    |0.32|
|20    |10875|29025    |0.37|
|20    |10875|29025    |0.37|
|20    |10875|29025    |0.37|
|20    |10875|29025    |0.37|
|20    |10875|29025    |0.37|
|10    |8750 |29025    |0.3 |
|10    |8750 |29025    |0.3 |
|10    |8750 |29025    |0.3 |
|NULL  |NULL |29025    |NULL|
+------+-----+---------+----+

总结

  • 此种情形要么别名+嵌套,要么不嵌套,但是也不能用别名!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

鸭梨山大哎

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

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

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

打赏作者

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

抵扣说明:

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

余额充值