sqlite查询乘以某列如果是null就换成_大数据之Hive group by with cube/rollup分组查询...

0256c47522d984f2dc1c8b93f6f5736d.png

group by

sql 查询时,我们常将聚合函数和group by 结合起来对某一个或多个字段进行分组查询,例如:

 select addcode,count(distinct sbtid)uv from tb_hive_window group by addcode;+----------+-----+| addcode  | uv  |+----------+-----+| 0002     | 2   || 000201   | 1   || 000202   | 1   || 000205   | 1   || 000206   | 1   || 000208   | 2   |+----------+-----+

group by fields ... grouping sets ()

有时候因业务需要,我们需要group by 多个字段,例如:

select addcode,count(distinct sbtid)uv from tb_hive_window group by addcode;select rscode,count(distinct sbtid)uv from tb_hive_window group by rscode;select addcode,rscode,count(distinct sbtid)uv from tb_hive_window group by addcode,rscode;//这种情况我们需要写3条sql 语句

通过grouping sets (), 我们可以通过一条sql 完成,相当于是将上面三条语句执行的结果通过union all 组合起来。

select addcode,rscode,count(*)pv,count(distinct sbtid)uv,grouping__id from tb_hive_window group by addcode,rscode grouping sets ((addcode,rscode),(addcode),(rscode));+----------+---------+-----+-----+---------------+| addcode  | rscode  | pv  | uv  | grouping__id  |+----------+---------+-----+-----+---------------+| NULL     | 34      | 1   | 1   | 2             || NULL     | 35      | 5   | 3   | 2             || NULL     | 40      | 1   | 1   | 2             || NULL     | 65      | 1   | 1   | 2             || NULL     | 351     | 1   | 1   | 2             || NULL     | 352     | 1   | 1   | 2             || NULL     | 395     | 1   | 1   | 2             || 0002     | NULL    | 2   | 2   | 1             || 0002     | 34      | 1   | 1   | 3             || 0002     | 352     | 1   | 1   | 3             || 000201   | NULL    | 1   | 1   | 1             || 000201   | 35      | 1   | 1   | 3             || 000202   | NULL    | 1   | 1   | 1             || 000202   | 35      | 1   | 1   | 3             || 000205   | NULL    | 3   | 1   | 1             || 000205   | 35      | 2   | 1   | 3             || 000205   | 395     | 1   | 1   | 3             || 000206   | NULL    | 2   | 1   | 1             || 000206   | 40      | 1   | 1   | 3             || 000206   | 65      | 1   | 1   | 3             || 000208   | NULL    | 2   | 2   | 1             || 000208   | 35      | 1   | 1   | 3             || 000208   | 351     | 1   | 1   | 3             |+----------+---------+-----+-----+---------------+

注意,

  • 当我们没有统计某一列值时,此时此列的值用null 表示,这可能与该列本身就是null 冲突,没关系下面我们通过grouping__id 就可以区分。
  • 此处需要说明的是grouping __id(两个下划线) 是十进制数,将其转换成二进制表示后可以明确的知道此grouping __id 所对应的是哪些group by 字段。

grouping by 后面的字段排序处理成二进制数,靠近group by 的是低位,远离group by 的是高位。查询出的每一行结果中,如果有统计此列即此列值不为null,二进制位用1表示,否则用0表示。

+----------+---------+-----+-----+---------------+| addcode  | rscode  | pv  | uv  | grouping__id  |+----------+---------+-----+-----+---------------+| NULL     | 34      | 1   | 1   | 2             |--->> 转换成二进制数:01 -->2 (注意远离group by 的字段是高位)| 0002     | NULL    | 2   | 2   | 1             |--->> 转换成二进制数:10 -->1| 0002     | 34      | 1   | 1   | 3             | --->> 转换成二进制数:11 -->1+2=3| 000201   | NULL    | 1   | 1   | 1             || 000201   | 35      | 1   | 1   | 3             |

注意:此处开源版hive 的grouping__id 计算方式与华为云的MRS 集群hive的grouping__id计算方式不同。mrs 中的grouping__id 计算时是以靠近group by 的字段为高位,远离的为低位,并且字段值为null 时 二进制位为1,否则为0

| 20200114        | 2020011406      | fengmizhibonew      | NULL              | NULL            | NULL           | NULL              | NULL                 | NULL                | 836          | 613          | 63                    

group by fields ... with cube

通过group by fields ... with cube 可是让hive 实现所有组合维度的查询,例如

select a,b,c,d,count(e) pv,count(distinct e) uv, grouping__id from tb_test group by a,b,c,d with cube;

根据排列组合计算,最终的组合有 C(4,1) + C(4,2) + C(4,3) + C(4,4) + 1 = 4 + 6 + 4 + 1 + 1 = 16 种组合,如果是通过单条group by 来实现,需要写16 条sql 才能完成,因此这种方案极大地降低了程序复杂度。

select addcode,rscode,count(*)pv,count(distinct sbtid)uv,grouping__id from tb_hive_window group by addcode,rscode with cube;+----------+---------+-----+-----+---------------+| addcode  | rscode  | pv  | uv  | grouping__id  |+----------+---------+-----+-----+---------------+| NULL     | NULL    | 11  | 6   | 0             || NULL     | 34      | 1   | 1   | 2             || NULL     | 35      | 5   | 3   | 2             || NULL     | 40      | 1   | 1   | 2             || NULL     | 65      | 1   | 1   | 2             || NULL     | 351     | 1   | 1   | 2             || NULL     | 352     | 1   | 1   | 2             || NULL     | 395     | 1   | 1   | 2             || 0002     | NULL    | 2   | 2   | 1             || 0002     | 34      | 1   | 1   | 3             || 0002     | 352     | 1   | 1   | 3             || 000201   | NULL    | 1   | 1   | 1             || 000201   | 35      | 1   | 1   | 3             || 000202   | NULL    | 1   | 1   | 1             || 000202   | 35      | 1   | 1   | 3             || 000205   | NULL    | 3   | 1   | 1             || 000205   | 35      | 2   | 1   | 3             || 000205   | 395     | 1   | 1   | 3             || 000206   | NULL    | 2   | 1   | 1             || 000206   | 40      | 1   | 1   | 3             || 000206   | 65      | 1   | 1   | 3             || 000208   | NULL    | 2   | 2   | 1             || 000208   | 35      | 1   | 1   | 3             || 000208   | 351     | 1   | 1   | 3             |+----------+---------+-----+-----+---------------+

group by fields ... with rollup

rollup 是cube 的子集,通过group by fields ... with rollup 可以实现以左侧维度为准,计算某一层次维度的聚合

select a,b,c,d,count(e) pv,count(distinct e) uv, grouping__id from tb_test group by a,b,c,d with rollup;//等效于select a,b,c,d,count(e) pv,count(distinct e) uv, grouping__id from tb_test group by a,b,c,d grouping sets((a,b,c,d),(a,b,c),(a,b),(a),());
select addcode,rscode,count(*)pv,count(distinct sbtid)uv,grouping__id from tb_hive_window group by addcode,rscode with rollup;+----------+---------+-----+-----+---------------+| addcode  | rscode  | pv  | uv  | grouping__id  |+----------+---------+-----+-----+---------------+| NULL     | NULL    | 11  | 6   | 0             || 0002     | NULL    | 2   | 2   | 1             || 0002     | 34      | 1   | 1   | 3             || 0002     | 352     | 1   | 1   | 3             || 000201   | NULL    | 1   | 1   | 1             || 000201   | 35      | 1   | 1   | 3             || 000202   | NULL    | 1   | 1   | 1             || 000202   | 35      | 1   | 1   | 3             || 000205   | NULL    | 3   | 1   | 1             || 000205   | 35      | 2   | 1   | 3             || 000205   | 395     | 1   | 1   | 3             || 000206   | NULL    | 2   | 1   | 1             || 000206   | 40      | 1   | 1   | 3             || 000206   | 65      | 1   | 1   | 3             || 000208   | NULL    | 2   | 2   | 1             || 000208   | 35      | 1   | 1   | 3             || 000208   | 351     | 1   | 1   | 3             |+----------+---------+-----+-----+---------------+
//通过grouping sets 实现得到同样的结果select addcode,rscode,count(*)pv,count(distinct sbtid)uv,grouping__id from tb_hive_window group by addcode,rscode grouping sets((addcode,rscode),(addcode),());+----------+---------+-----+-----+---------------+| addcode  | rscode  | pv  | uv  | grouping__id  |+----------+---------+-----+-----+---------------+| NULL     | NULL    | 11  | 6   | 0             || 0002     | NULL    | 2   | 2   | 1             || 0002     | 34      | 1   | 1   | 3             || 0002     | 352     | 1   | 1   | 3             || 000201   | NULL    | 1   | 1   | 1             || 000201   | 35      | 1   | 1   | 3             || 000202   | NULL    | 1   | 1   | 1             || 000202   | 35      | 1   | 1   | 3             || 000205   | NULL    | 3   | 1   | 1             || 000205   | 35      | 2   | 1   | 3             || 000205   | 395     | 1   | 1   | 3             || 000206   | NULL    | 2   | 1   | 1             || 000206   | 40      | 1   | 1   | 3             || 000206   | 65      | 1   | 1   | 3             || 000208   | NULL    | 2   | 2   | 1             || 000208   | 35      | 1   | 1   | 3             || 000208   | 351     | 1   | 1   | 3             |+----------+---------+-----+-----+---------------+

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/489227.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

可以操作excel吗_Excel快速填充,这四种方法你会吗?操作逆天告别加班

在Excel的表格制作中,仅仅会复制粘贴可是不够的,还需要掌握更多的技能,来提升我们的工作效率!我们在进行Excel报表制作的时候,如果要批量填充序号,有多少种方法呢?下面给大家简单介绍一下这四种…

2G---5G与未来天线技术

本文来源:滤波器过去二十年,我们见证了移动通信从1G到4G LTE的转变。在这期间,通信的关键技术在发生变化,处理的信息量成倍增长。而天线,是实现这一跨越式提升不可或缺的组件。按照业界的定义,天线是一种变…

python操作csv文件第7行开始的数据_Python教程-Python读写CSV文件

前言 本教程学习在Python中使用CSV文件。CSV(逗号分隔值)格式是在电子表格和数据库中使用的非常流行的导入和导出格式。Python语言包含该模块,该模块具有用于读取和写入CSV格式的数据的类。csv 使用csv.reader()读取CS…

基于STM32的高精度频率计设计

前言 本文记录了博主完成的一个课设作品(学分为3.5分),题目需要利用ARM做出一个高精度频率计。具体要求如下: 1)实现对10M以内数字信号频率的高精度测量,频率测量误差不大于0.01%; 2&#xff0…

数学的意义(一)

来源: 数学职业家数学既是一种文化、一种“思想的体操”,更是现代理性文化的核心。马克思说:“一门科学只有当它达到了能够成功地运用数学时,才算真正发展了。”在前几次科技革命中,数学大都起到先导和支柱作用。我们不…

python弹球小游戏程序_Python实现弹球小游戏

本文主要给大家分享一个实战项目,通过python代码写一款我们儿时大多数人玩过的游戏---小弹球游戏。只不过当时,我们是在游戏机上玩,现在我们通过运行代码来玩,看看大家是否有不一样的体验,是否可以重温当年的乐趣呢&am…

强化学习决策生成-以 Q-learning 为例

强化学习决策生成-以 Q-learning 为例

【数据中台】关于数据中台系统,需要了解哪些技术?

来源:产业智能官国家建材大数据研究中心今天让我们全面解读中台,包括企业为什么要平台化,目前中台都有哪些形式,实施中台系统的优势、面临的问题以及建议都有哪些?中台这个概念早期是由美军的作战体系演化而来的&#…

什么是启发式?什么是产生式?

来源:人机与认知实验室一般而言,机器常常被设定从已知推未知,而人们不时会从未知(假设)推未知,特殊情形下也有从未知推已知的,这些推导中常见的有产生式和启发式,那么究竟什么是产生…

Maven项目错误解决小结

http://blog.csdn.net/typa01_kk/article/details/49185759 Maven项目错误解决小结 注:整理错误,不喜欢为了一个小问题,占篇幅,所以请CtrlF自己查看,定位问题,愿为解决. 注:网络上的错误解决经验…

python交并补_python两个列表求交、并、差

在python中,如果有两个数组,分别要求交集,并集与差集,怎么实现比较方便呢? 当然最容易想到的是对两个数组做循环,即写两个for循环来实现。这种写法大部分同学应该都会,而且也没有太多的技术含量…

可怕!贺建奎论文手稿意外曝光!基因编辑实验充满谎言

来源:学研加中国双胞胎的基因编辑可能已经失败,并产生了意想不到的突变。这是科学家们阅读了原南方科技大学副教授贺建奎论文手稿后,得出的结论。贺建奎基因编辑婴儿事件2018年11月26日,一则《世界首例免疫艾滋病的基因编辑婴儿在…

l360废墨收集垫清零_知识分享003:EPSON L360打印机出现故障-废墨计数清零

故障现象:客户的EPSON L360打印机出现故障,纸张和墨水报警灯交替闪烁。无法打印原因分析:确定纸张和墨水的是处于正常状态,上网查了,可能是废墨收集到达了上限。需要做清零处理。解决方法:根据这个型号EPSO…

R语言-处理异常值或报错的三个示例

R语言-处理异常值或报错的三个示例 之前用rvest帮人写了一个定期抓取amazon价格库存,并与之前价格比较的小程序,算是近期写过的第一个完整的程序了。里面涉及了一些报错的处理。 这里主要参考了stackoverflow上的以下问答: How to skip an er…

联想e580没有声音_现在你可以购买通过 Linux 认证的联想 ThinkPad 和 ThinkStation

曾经有一段时间,ThinkPad 是 Linux 用户的首选系统。但那是在 ThinkPad 还是 IBM 的产品的时候。来源:https://linux.cn/article-12283-1.html作者:Abhishek Prakash译者:Xingyu.Wang曾经有一段时间,ThinkPad 是 Linux…

UC伯克利教授Stuart Russell人工智能基础概念与34个误区

来源:数据简化DataSimp数据简化DataSimp导读:UC伯克利教授StuartRussell人工智能基础概念与34个误区,Russell是加州大学伯克利分校人工智能系统中心创始人兼计算机科学专业教授,同时还是人工智能领域里「标准教科书」《人工智能&a…

装入归档文件时出现了一个错误linux_静态链接与动态链接(Linux)

前言上一篇分享了静态链接与动态链接的实验(Windows下)。这一篇分享Linux下的笔记,同时对上一篇笔记做一个补充。首先,我们把静态链接与动态链接做一个这样子的比喻:把链接过程看做我们平时学习时做笔记的过程。我们平时学习时准备一本笔记本…

9008刷机怎么刷_OV快捷进入高通进9008或fastboot模式刷机解锁,和MTK关机解锁

不喜略过。高通进9008刷机解锁:关机状态下,同时按音量下键上键插线进9008 .(注意安装手机驱动)高通进fastboot模式解锁:旧机型(平台上选择不到机型的)进fast解锁,关机状态 音量下键开机键 MTK关机解锁:关机状态下按音量上键&#…

10年内,19个关键技术将改变世界

来源: 科技联盟技术中心据国外媒体报道,从无人驾驶汽车到机器人工人,在我们熟悉所有这一切之前,未来正迎面走来。根据世界经济论坛全球议程理事会关于《未来软件与社会》的一份报告,到2025年前,很多新兴技术…

scope参数错误或没有scope权限_SSM 单体框架 - 前端开发:用户和权限模块

用户管理分页 & 条件查询用户数据查询条件1. 用户手机号 2. 注册时间,包含开始日期和结束日期日期选择器组件在查询条件中使用了 Element UI 中的日期选择器:https://element.eleme.cn/#/zh-CN/component/date-picker#mo-ren-xian-shi-ri-qi在测试项目中创建一个…