目录

  • 关键字:
  • 简单示例:
  • 实例一:
  • presto中grouping sets函数

关键字:

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

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

简单示例:

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

create table temp.score_grouping as
selectgrouping__id, ---grouping__id是两个下划线class,sex,course,avg(score)
fromtableName
group by  --group by包含所需所有维度字段class,sex,course -------此处无逗号
grouping sets
((class,  course),( class,sex),(sex,course),(course)
)
select *
from temp.score_grouping
where grouping__id in ('2','6')

说明:
1、select子句中的GROUPING__ID是两个下划线;
2、group by后面放的字段表示要分组聚合的全部字段;
3、grouping sets前没有逗号;
4、grouping_id的计算:
它是根据group by后面声明的顺序字段是否存在于当前group by中的一个二进制位组合数据,若组合中出现即为1,反正则为0,group by 后字段先出现的放在最低位,依次排开:
比如 group by class,sex,course,则二进制的顺序为:course sex class ,grouping sets字段出现则为1,反之则为0,
比如(class, course), 二进制为 101,十进制则为5,则grouping__id为5,同理grouping__id为6,则组合为(sex,course),二进制为110;

实例一:

-- 正确语句
select province,city,catgory_id,catgory_name,goodsid,goodsname,sum(sales_qty) as sales_qty,sum(sales_amt) as sales_amt,GROUPING__ID
from
(
select t1.province,t1.city,t2.catgory_id,t2.catgory_name,t1.goodsid,t1.goodsname,sales_qty,sales_amt
from temp.goods_sale_info t1
left join
temp.goods_info t2
on t1.goodsid=t2.goodsid
) t  --在表t的基础上使用grouping sets函数
group by province,city,catgory_id,catgory_name,goodsid,goodsnamegrouping sets((province,catgory_id,catgory_name) --这里仅有3个字段,但select中列有不在sets中的非分组字段city、goodsid、goodsname,hive不报错,presto会报错)

注意:
1.双表联结的结果出来之后再用grouping sets,即先有t 表,在表t的基础上使用grouping sets函数;
2.sets中的字段不应该含表名;

presto中grouping sets函数

示例:

-- 如果group by写上单一字段
select province,city,catgory_id,catgory_name,goodsid,goodsname,sum(sales_qty) as sales_qty,sum(sales_amt) as sales_amt,grouping(province,city,catgory_id,catgory_name,goodsid,goodsname)
from
(
select t1.province,t1.city,t2.catgory_id,t2.catgory_name,t1.goodsid,t1.goodsname,sales_qty,sales_amt
from temp.goods_sale_info t1
left join
temp.goods_info t2
on t1.goodsid=t2.goodsid
) t  --也是要在表t的基础上使用grouping sets函数
group by province,city,catgory_id,catgory_name,goodsid,goodsname,grouping sets( --这里记得加上逗号,(province,catgory_id,catgory_name),(province,catgory_id,catgory_name,goodsid,goodsname),(province,city),(province))

注意:
1、函数grouping要与group by、grouping sets配合使用
2、函数grouping()中列出sets中所有分组涉及的字段,运行后grouing()列生成结果为二进制转化来的十进制数字;,出现为0,不出现为1,按照顺序,早出现的放高位,依次类推;

SELECT origin_state, origin_zip, destination_state, sum(package_weight),grouping(origin_state, origin_zip, destination_state)
FROM shipping
GROUP BY GROUPING SETS ((origin_state)---011  3,(origin_state, origin_zip) --001  1,(destination_state));---110   6
origin_state | origin_zip | destination_state | _col3 | _col4
--------------+------------+-------------------+-------+-------
California   | NULL       | NULL              |  1397 |     3
New Jersey   | NULL       | NULL              |   225 |     3
New York     | NULL       | NULL              |     3 |     3
California   |      94131 | NULL              |    60 |     1
New Jersey   |       7081 | NULL              |   225 |     1
California   |      90210 | NULL              |  1337 |     1
New York     |      10002 | NULL              |     3 |     1
NULL         | NULL       | New Jersey        |    58 |     6
NULL         | NULL       | Connecticut       |  1562 |     6
NULL         | NULL       | Colorado          |     5 |     6
(10 rows)

3、group by后面只跟grouping sets(),不加select中的单一字段,否则函数grouping sets无作用

-- 如果group by写上单一字段
select province,city,catgory_id,catgory_name,goodsid,goodsname,sum(sales_qty) as sales_qty,sum(sales_amt) as sales_amt,grouping(province,city,catgory_id,catgory_name,goodsid,goodsname)
from
(
select t1.province,t1.city,t2.catgory_id,t2.catgory_name,t1.goodsid,t1.goodsname,sales_qty,sales_amt
from temp.goods_sale_info t1
left join
temp.goods_info t2
on t1.goodsid=t2.goodsid
) t  --也是要在表t的基础上使用grouping sets函数
group by province,city,catgory_id,catgory_name,goodsid,goodsname,grouping sets( --这里记得加上逗号,(province,catgory_id,catgory_name),(province,catgory_id,catgory_name,goodsid,goodsname),(province,city),(province))

4、不用的分组字段不要在select子句中写出

-- 与hive不同,如果不出现在grouping sets中的字段,select子句写上会报错
-- 比如sets中不涉及city、goodsid、goodsname,select子句中写出来报错
select province
--  ,city,catgory_id,catgory_name
--  ,goodsid
--  ,goodsname,sum(sales_qty) as sales_qty,sum(sales_amt) as sales_amt,grouping(province,catgory_id,catgory_name)
from
(
select t1.province,t1.city,t2.catgory_id,t2.catgory_name,t1.goodsid,t1.goodsname,sales_qty,sales_amt
from temp.goods_sale_info t1
left join
temp.goods_info t2
on t1.goodsid=t2.goodsid
) t
group by grouping sets((province,catgory_id,catgory_name))

5、函数grouping中要将grouping sets所有分组组合用到的字段取并集列出

Hive之grouping sets用法详解相关推荐

  1. Hive中row_number()函数用法详解及示例

    目录 一.Hive 中row_number()函数介绍 二.使用示例 三.总结 四.附录 在Oracle中,我们经常会用到row_number() over(partition by clo1 ord ...

  2. Python中self用法详解

    Python中self用法详解 https://blog.csdn.net/CLHugh/article/details/75000104 首页 博客 学院 下载 图文课 论坛 APP 问答 商城 V ...

  3. python explode_pandas dataframe 中的explode函数用法详解

    在使用 pandas 进行数据分析的过程中,我们常常会遇到将一行数据展开成多行的需求,多么希望能有一个类似于 hive sql 中的 explode 函数. 这个函数如下: Code # !/usr/ ...

  4. python中setattr()函数用法详解

    setattr() 函数对应函数 getattr(),用于设置属性值,该属性不一定是存在的. getattr()用法详见博文:python中getattr()函数用法详解_IT之一小佬的博客-CSDN ...

  5. MySQL中Case When用法详解

    最近,在学习Hive基础知识时,遇到了遇到了Case When Else End语法,以前学习MySQL时忽略了这部分知识点,现总结一下相关的知识给大家.首先练习一个例子如下: 一.学生课程成绩统计 ...

  6. python argv 详解_Python3 sys.argv[ ]用法详解

    sys.argv[]说白了就是一个从程序外部获取参数的桥梁,这个"外部"很关键,因为我们从外部取得的参数可以是多个,所以获得的是一个列表(list),也就是说sys.argv其实可 ...

  7. oracle中的exists 和 not exists 用法详解

    from:http://blog.sina.com.cn/s/blog_601d1ce30100cyrb.html oracle中的exists 和 not exists 用法详解 (2009-05- ...

  8. ROW_NUMBER() OVER()函数用法详解 (分组排序 例子多)

    ROW_NUMBER() OVER()函数用法详解 (分组排序 例子多) https://blog.csdn.net/qq_25221835/article/details/82762416 post ...

  9. python的继承用法_【后端开发】python中继承有什么用法?python继承的用法详解

    本篇文章给大家带来的内容是关于python中继承有什么用法?python继承的用法详解,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 面向对象三大特征 1.封装:根据职责将属性和方法 ...

最新文章

  1. jq修改iframe html代码,使用jQuery替换iframe的所有内容(包括doctype和html标签)
  2. 15行代码让苹果设备崩溃,最新的iOS 12也无法幸免
  3. 25.智能指针.rs
  4. 轻量级文本编辑器,Notepad最佳替代品:Notepad++
  5. Android基础字符串String.md
  6. RabbitMQ的5种队列_简单队列_入门试炼_第4篇
  7. 【MapReduce】MapReduce(DataJoin)实现数据连接+Bloom Filter优化
  8. 【Opencv】基于色差的简单目标提取
  9. matlab tic and toc,什么是Python等价于Matlab的tic和toc函数?
  10. 微信小程序 腾讯地图大头针定位,获取当前地址,地图移动选点,定位当前位置
  11. 魏鹏机器人_3D打印室、机器人工程挑战室……山东这所学校的“网红教室”火了!...
  12. 基于FPGA的目标颜色识别追踪三——FIFO(同/异步FIFO)、DDR3
  13. play 1.2.7
  14. NRF24L01的多对一通信
  15. 学计算机了情话,二十句哄女朋友的情话 每句都很管用
  16. 文件操作与文件夹操作
  17. 输入若干用户的用户名和密码
  18. 计算机windows解压文件,Win10专业版怎么压缩和解压缩文件 简单快速的解压缩方法...
  19. tomcat7解压版的下载与配置
  20. 施工导截流方案设计软件现状

热门文章

  1. 数据之美 百度GOOGLE统计的秘密
  2. BuaaCoding 026-050 Problems and Solutions
  3. idea 一行js_IntelliJ IDEA使用之JavaScript
  4. java getclass用法_java 中getClass()的用法
  5. LRU算法,以及Apache LRUMap源码解析
  6. 【1】Talking-Heads Attention
  7. 骑行时膝盖损伤的原因
  8. 为python开通的一个博客,希望能步入老年的自己成为极客
  9. 颈椎不舒服按摩哪个穴位
  10. 智能充电,共享广告,寻找城市合伙人|拾里郎