• GROUPING SETS: 根据不同的维度组合进行聚合,等价于将不同维度的GROUP BY结果集进行UNION ALL

  • GROUPING__ID:表示结果属于哪一个分组集合,属于虚字段

  • CUBE: 根据GROUP BY的维度的所有组合进行聚合。

  • ROLLUP: 为CUBE的子集,以最左侧的维度为主,从该维度进行层级聚合。

关于grouping sets的使用,我是参考这篇博客学习的,感觉讲的很清楚  网址链接

通俗的说,grouping sets是一种将多个group by 逻辑写在一个sql语句中的便利写法

select
    A,
    B,
    C,
    group_id, 
    count(A)
from
    tableName
group by  --declare columns
    A,
    B,
    C
grouping sets
(
   (A,C),
   (A,B),
   (B,C),
   (C)
)

 

其中grouping sets中的(A,C),   (A,B),   (B,C),   (C) 代表4个group by 组合, 相当于写了四个sql查询语句使用了四个不同的group by策略。

group_id是为了区分每条输出结果是属于哪一个group by的数据。它是根据group by后面声明的顺序字段是否存在于当前group by中的一个二进制位组合数据。 比如(A,C)的group_id: group_id(A,C) = grouping(A)+grouping(B)+grouping (C) 的结果就是:二进制:101 也就是5.

 

select中的字段是完整的A,B,C,但是我们知道由于group by的存在,select 字段本不应该出现非group by字段的,所以这里我们要特别说明,如果解释器发现group by A,C 但是select A,B,C 那么运行时会将所有from 表取出的结果复制一份,B都置为null,也就是在结果中,B都为null。

hive中grouping sets的使用

 1、对所有明细数据按年份、月份、年月,三者分别汇总,获取其汇总结果

select year,month,sum(cost) AS all_cost,GROUPING__ID from

(

SELECT year(orderdatetime) as year,  

     month(orderdatetime) as month,  

     cost

FROM analysis_daily_expense   

) middle

GROUP BY year,month

GROUPING SETS (year,month,(year,month))

ORDER BY GROUPING__ID;

运行结果如下:

hive中grouping sets的使用

 

相关文章: