hive中的group by分组查询注意和其他其他传统关系数据库sql的区别

顾名思义就是按照指定的一个或者多个字段就行分组查询,返回每个组的相关值,group by时常与聚合函数结合使用,

这里需要注意的是, 

1、在hive中, 一旦有group by子句,那么,在select子句中只能有分组字段,聚合函数以及值的水平是唯一的字段(常量)。否则会提示Expression not in GROUP BY key '不应该在select中的字段名'。想想,如果一个字段的值的水平不止一个,然后又不对他就行聚合函数运算,那么是没有办法分组显示的。

2、多分组查询的时候,假设用2个字段分组,一个字段的值有3个水平,另一个字段的值有4个水平,那总共会有3*4=12个分组。

例如:有如下数据

hive中的group by分组查询注意和其他其他传统关系数据库sql的区别_第1张图片

求每条URL的访问总次数
select url,count(1) as cnts   -- 该表达式是对分好组的数据进行逐组运算
from t_pv_log 
group by url;

---------------------------------------------------------

hive中的group by分组查询注意和其他其他传统关系数据库sql的区别_第2张图片

上图的数据中求每个用户访问同一个页面的所有记录中,时间最晚的一条

select ip,url,max(access_time) 
from  t_pv_log
group by ip,url;

---------------------------------------------------------------

3、为什么where必须写在group by的前面,为什么group by后面的条件只能用having

因为,where是用于在真正执行查询逻辑之前过滤数据用的

having是对group by聚合之后的结果进行再过滤;

上述语句的执行逻辑:

1)、where过滤不满足条件的数据

2)、用聚合函数和group by进行数据运算聚合,得到聚合结果

3)、用having条件过滤掉聚合结果中不满足条件的数据

4、多个字段同时聚合的时候,不能有两个聚合函数有不同的DISTINCT列,下面的语句是合法的:

select gender, count(DISTINCT userid),sum(DISTINCT userid) from user_info  group by gender ;

你可能感兴趣的:(hive,mysql,hive)