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,一经查实,立即删除!

相关文章

Windows下MYSQL的安装与配置

配置: 1. 安装MySQL服务 cmd(管理员模式)下切换到MySQL的bin目录,运行 mysqld install 2. 输入 net start mysql 启动服务 3. 输入 mysql -uroot -p 进入,默认无密码 4. 设置密码 mysqladmin -uroot -p 新密码 (会提示输入密码&am…

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

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

我的一个树莓派小车项目

如何使用该程序进行开发 1.寻找串口 查看识别串口号 ls -l /dev/tty*找到相应的串口并在程序里修改 ser serial.Serial("/dev/ttyUSB0",9600)2.摄像头 括号里是0还是1取决于摄像头是内部还是外部 不确定的话就挨着尝试,反正就是二选一嘛 #视频捕获…

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

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

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

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

leancloud的技术面试指南

面试流程 通常我们的面试分为一次电话面试和一次现场面试。在少数难以决定的时候会多增加一轮电话或现场面试。 面试中的沟通问题 尊重候选人,平等交流:让候选人自我介绍前,先介绍自己和公司;交流的时候双方处于平等的地位&#x…

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

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

数学的意义(一)

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

node都会 react_学react需要node吗

学react需要node吗学习react不需要安装node,react.js和node.js没有太大的关联性。完全可以独立的学习react.js。但我们通常都会使用react提供的脚手架搭建项目结构,这个就需要用到node了。但node.js只需要会它的npm安装包就可以了。一、常用工具介绍1. n…

.Net Core 学习资料

官方网站:https://www.microsoft.com/net/core#windows 官方文档:https://docs.asp.net/en/latest/intro.html中文翻译小组:http://www.cnblogs.com/dotNETCoreSG/p/aspnetcore-index.html发布到Jexus:http://www.cnblogs.com/gao…

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

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

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

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

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

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

python自动拨号_Python自动连接ssh的方法

作者:Sephiroth 字体: 类型:转载这篇文章主要介绍了Python自动连接ssh的方法,实例分析了基于Python实现连接ssh的技巧,具有一定参考借鉴价值,需要的朋友可以参考下本文实例讲述了Python自动连接ssh的方法。分享给大家供大家参考。具体实现方法…

数据库 proc编程七

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h> #include "sqlca.h"//定义char [20]数组类型 typedef char ChararrType[20];//oracle外部变量类型string类似varchar2类型&#xff0c;是以\0结尾的…

anaconda+cuda+cudnn+pytorch安装踩坑大全

windows环境下anacondapycharmcudacudnnpytorch安装踩坑大全anaconda安装pycharm安装cudacudnnpytorchgym环境安装anaconda安装 安装时不要勾选添加环境变量&#xff0c;完事后自己去手动添加。添加时注意是用户变量还是系统变量&#xff0c;我这个就搞错了&#xff0c;导致重…

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

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

Maven项目错误解决小结

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

python的pillow给图片加文字_Python-Pillow库给图片添加文字、水印

apt-get install -y python-PIL在图片右下角添加文字&#xff1a;Python# -*- coding: utf-8 -*-from PIL import Image, ImageDraw, ImageFont# 指定要使用的字体和大小&#xff1b;/Library/Fonts/是macOS字体目录&#xff1b;Linux的字体目录是/usr/share/fonts/font Image…

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

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