如果hive语句中有group by语句,那么select语句中只会有三种可查询的字段或者说情况:
1、分组组名
2、聚合函数
3、常量
只能是这三种的一个或者多个的组合,否则报错。(分组后的每组只会有一行数据,故只能对每组的数据由多到一的转变)
PS:
1.标量函数
分组组名不仅仅是group by的字段,还可以是各种分组字段的标量函数,比如concat(),data_format(),什么都可以,但只能用分组后的字段。
2.开窗函数
开窗函数并不是所有的都满足可以运行的条件,字段参数才是决定能否运行的关键,该开窗函数中的所有字段:开窗字段,partition by的字段,以及order by的字段,都是要在group by筛选后的字段之中才能使用。例如:
select
creator, -- 出单人
count(*), -- 每个保费出单量
total_premium, -- 该保费
sum(total_premium) over(partition by creator order by gmt_create) as sum_premium
-- 这个窗口函数运行会报错,因为gmt_create字段找不到,没在group by中
from dwd_policy_info
where pt='20221215'
group by creator,total_premium -- 获取保费及出单人
;
准确说上面这段代码,重新根据执行顺序翻译一下应该如下
from dwd_policy_info
where pt='20221215'
group by creator,total_premium -- 获取保费及出单人
select
creator, -- 出单人
count(*), -- 每个保费出单量
total_premium, -- 该保费
sum(total_premium) over(partition by creator order by gmt_create) as sum_premium
-- 这个窗口函数运行会报错,因为gmt_create字段找不到,没在group by中
;
这样看应该比较明显,在group by筛选后,字段只有creator与total_premium了,因此select中只能携带这两个字段。