hive3.x的round函数

hive3.x的round函数

select si.stu_id ,round(avg(si.score),2) score_avg
from score_info si 
group by si.stu_id 
having score_avg > 60;

select si.stu_id ,avg(si.score) score_avg
from score_info si 
group by si.stu_id 
having score_avg > 60;

当加了round后就无法执行,报错:SQL 错误 [10025] [42000]: Error while compiling statement: FAILED: SemanticException [Error 10025]: Line 5:7 Expression not in GROUP BY key '60'
求解释一下为什么。

GROUP BY 语句通常会和聚合函数一起使用,按照一个或者多个列对结果进行分组,然后对每个组执行聚合操作。在 SELECT 子句中出现的字段,如果不是在聚合函数(比如 SUM、COUNT、AVG等)中,那就必须要放到 GROUP BY 子句中,相反没有出现在 GROUP BY 子句中的字段,只能出现在聚合函数中。Hive 不认为 ROUND 是一个聚合函数,ROUND 中使用的字段必须添加到 GROUP BY 中,否则就会抛出上面的异常信息。但是 GROUP BY 语句中是不能使用 AVG 聚合函数。所以需要嵌套子查询的方式实现。

https://smartsi.blog.csdn.net/article/details/129272452?spm=1001.2014.3001.5502

该回答引用GPTᴼᴾᴱᴺᴬᴵ
在 Hive 中,如果 SELECT 子句中有聚合函数(如 avg)或 GROUP BY 子句,那么非聚合列必须出现在 GROUP BY 子句中。这是因为 GROUP BY 子句的作用是将相同的值分组在一起,从而可以应用聚合函数计算它们的值。
-
在第一个查询中,avg(si.score)被用于 SELECT 子句中,并且ROUND 函数应用于该聚合函数的结果。因此,GROUP BY 子句只需要按照si.stu_id分组,并没有非聚合列需要出现在 GROUP BY 子句中。因此,查询是有效的。
-
但在第二个查询中,SELECT 子句中只有avg(si.score)聚合函数,没有使用ROUND函数,所以GROUP BY 子句必须包括非聚合列。由于 score_avg 不在 GROUP BY 子句中,所以在执行查询时,Hive 会抛出语义错误。