【Hive】窗口函数
我们都知道在sql中有一类函数叫做聚合函数,例如sum()、avg()、max()等等,
这类函数可以将多行数据按照规则聚集为一行,一般来讲聚集后的行数是要少于聚集前的行数的.
但是有时我们想要既显示聚集前的数据,又要显示聚集后的数据,这时我们便引入了窗口函数.
hive中的窗口函数和sql中的窗口函数相类似,都是用来做一些数据分析类的工作,一般用于olap分析。
在深入研究Over字句之前,一定要注意:在SQL处理中,窗口函数都是最后一步执行,而且仅位于Order by字句之前.还有窗口函数是对select出来的数据进行处理分析得出来的结果。
顺序是先select,用select的结果进行窗口函数的处理分析。
1.分析函数
分析函数主要分为sum avg min max count等
我们这里主要分析Sum() over() 和 count() over分析函数使用,其他类同
创建测试表
create table test(sales_id varchar2(2),sales varchar2(10),dest varchar2(10),dept varchar2(10),revenue number);
插入测试数据
insert into test values('11','smith','hangzhou','市场',1000);
insert into test values('12','smith','wenzhou','市场',2000);
insert into test values('13','allen','wenzhou','渠道',3000);
insert into test values('14','allen','wenzhou','渠道',4000);
insert into test values('15','jekch','shanghai','渠道',2500);
insert into test values('11','smith','hangzhou','市场',1000);
insert into test values('12','smith','wenzhou','市场',2000);
commit;
查询所有数据
SQL> select * from test;
SALES_ID SALES DEST DEPT REVENUE
-------- ---------- ---------- ---------- ----------
11 smith hangzhou 市场 1000
12 smith wenzhou 市场 2000
13 allen wenzhou 渠道 3000
14 allen wenzhou 渠道 4000
15 jekch shanghai 渠道 2500
11 smith hangzhou 市场 1000
12 smith wenzhou 市场 2000
用窗口函数计算总销售额
SQL> select sales_id, sales,dest,dept,revenue,
sum(revenue) over() as 总销售额
from test;
SALES_ID SALES DEST DEPT REVENUE 总销售额
-------- - --------- ---------- ---------- ---------- ----------
11 smith hangzhou 市场 1000 15500
12 smith wenzhou 市场 2000 15500
13 allen wenzhou 渠道 3000 15500
14 allen wenzhou 渠道 4000 15500
15 jekch shanghai 渠道 2500 15500
11 smith hangzhou 市场 1000 15500
12 smith wenzhou 市场 2000 15500
按照sales_id order by排序计算递加的销售总额
SQL> select sales_id,sales,dest,dept,revenue,
sum(revenue)over(order by sales) 递加销售总额
from test;
SALES_ID SALES DEST DEPT REVENUE 递加销售总额
-------- ---------- ---------- ---------- ---------- ------------
14 allen wenzhou 渠道 4000 7000
13 allen wenzhou 渠道 3000 7000
15 jekch shanghai 渠道 2500 9500
11 smith hangzhou 市场 1000 15500
12 smith wenzhou 市场 2000 15500
12 smith wenzhou 市场 2000 15500
11 smith hangzhou 市场 1000 15500
对sales_id进行分组,然后分组求sum
SQL> select sales_id,sales,dest,dept,revenue,
sum(revenue)over(partition by sales_id) 分组销售总额
from test;
SALES_ID SALES DEST DEPT REVENUE 分组销售总额
-------- ---------- ---------- ---------- ---------- ------------
11 smith hangzhou 市场 1000 2000
11 smith hangzhou 市场 1000 2000
12 smith wenzhou 市场 2000 4000
12 smith wenzhou 市场 2000 4000
13 allen wenzhou 渠道 3000 3000
14 allen wenzhou 渠道 4000 4000
15 jekch shanghai 渠道 2500 2500
注意,sum over(partition by) 和 sum group by 的区别是什么?
sum over(partition by) 是先select,然后进行窗口函数,这是一对一的。这里所有的数据都在,并没有合并,只是多出来一个窗口函数分析的数据列。
sum group by 则是先分组聚合,多变成了一,显示的并不是全部数据,而是聚合后求sum的数据。
对sales进行分组,然后分组内递加sum。
SQL> select sales_id,sales,dest,dept,revenue,
sum(revenue)over(partition by sales order by sales_id) 分组递加销售总额
from test;
SALES_ID SALES DEST DEPT REVENUE 分组递加销售总额
-------- ---------- ---------- ---------- ---------- ----------------
13 allen wenzhou 渠道 3000 3000
14 allen wenzhou 渠道 4000 7000
15 jekch shanghai 渠道 2500 2500
11 smith hangzhou 市场 1000 2000
11 smith hangzhou 市场 1000 2000
12 smith wenzhou 市场 2000 6000
12 smith wenzhou 市场 2000 6000
看下来的count()over()分析函数的使用
SQL> select sales_id,sales,
count(*)over() 求总计数,
count(*)over(order by sales_id) 递加求计数,
count(*)over(partition by sales_id) 分组求计数,
count(*)over(partition by sales_id order by sales) 分组递加求计数
from test;
SALES_ID SALES 求总计数 递加求计数 分组求计数 分组递加求计数
-------- ---------- ---------- ---------- ---------- --------------
11 smith 7 2 2 2
11 smith 7 2 2 2
12 smith 7 4 2 2
12 smith 7 4 2 2
13 allen 7 5 1 1
14 allen 7 6 1 1
15 jekch 7 7 1 1
如果我们想要更细粒度的划分,我们就要引入window子句了.
我们首先要理解两个概念:
- 如果只使用partition by子句,未指定order by的话,我们的聚合是分组内的聚合.
- 使用了order by子句,未使用window子句的情况下,默认从起点到当前行.
当同一个select查询中存在多个窗口函数时,他们相互之间是没有影响的.每个窗口函数应用自己的规则.
window子句:
- PRECEDING:往前
- FOLLOWING:往后
- CURRENT ROW:当前行
- UNBOUNDED:起点,UNBOUNDED PRECEDING 表示从前面的起点, UNBOUNDED FOLLOWING:表示到后面的终点
sum(revenue)over(partition by sales order by sales_id ROWS between UNBOUNDED PRECEDING and CURRENT ROW);
由起点到当前行,默认也是由起点到当前行,做聚合
sum(revenue)over(partition by sales order by sales_id ROWS between 1 PRECEDING and CURRENT ROW);
当前行到前面一行做聚合
sum(revenue)over(partition by sales order by sales_id ROWS between 1 PRECEDING and 1 FOLLOWING);
当前一行到前面一行做聚合
sum(revenue)over(partition by sales order by sales_id ROWS between CURRENT ROW and UNBOUNDED PRECEDING);
当前行到后边所有行做聚合
2.序列函数
主要序列函数是不支持window子句的.
hive中常用的序列函数有下面几个:
NTILE
NTILE(n),用于将分组数据按照顺序切分成n片,返回当前切片值
NTILE不支持ROWS BETWEEN,
比如 NTILE(2) OVER(PARTITION BY cookieid ORDER BY createtime ROWS BETWEEN 3 PRECEDING AND CURRENT ROW)- 如果切片不均匀,默认增加第一个切片的分布
select sales_id, sales,dest,dept,revenue,
sum(revenue) NTILE(1) over() as 总销售额
from test;
row_number、rank、dense_rank
这三个窗口函数的使用场景非常多
- row_number()从1开始,按照顺序,生成分组内记录的序列,row_number()的值不会存在重复,当排序的值相同时,按照表中记录的顺序进行排列
- RANK() 生成数据项在分组中的排名,排名相等会在名次中留下空位
- DENSE_RANK() 生成数据项在分组中的排名,排名相等会在名次中不会留下空位
select sales_id,sales,dest,dept,revenue,
RANK() over(partition by sales order by sales_id) 分组递加销售总额
from test;
LAG和LEAD函数
这两个函数为常用的窗口函数,可以返回上下数据行的数据.
first_value和last_value
first_value取分组内排序后,截止到当前行,第一个值
last_value取分组内排序后,截止到当前行,最后一个值
【Hive】窗口函数的更多相关文章
- Hive 窗口函数sum() over()求当前行和前面n条数据的和
前几天遇到一个这样的需求:销售总占比加起来超过75%的top分类.具体需求是这样的:商品一级分类标签下面有许多商品标签,例如运动户外一级标签,下面可能存在361°,CBA,Nike,Adidas... ...
- hive窗口函数/分析函数详细剖析
hive窗口函数/分析函数 在sql中有一类函数叫做聚合函数,例如sum().avg().max()等等,这类函数可以将多行数据按照规则聚集为一行,一般来讲聚集后的行数是要少于聚集前的行数的.但是有时 ...
- Hive窗口函数保姆级教程
在SQL中有一类函数叫做聚合函数,例如sum().avg().max()等等,这类函数可以将多行数据按照规则聚集为一行,一般来讲聚集后的行数是要少于聚集前的行数的.但是有时我们想要既显示聚集前的数据, ...
- Hive 窗口函数、分析函数
1 分析函数:用于等级.百分点.n分片等 Ntile 是Hive很强大的一个分析函数. 可以看成是:它把有序的数据集合 平均分配 到 指定的数量(num)个桶中, 将桶号分配给每一行.如果不能平均分配 ...
- Hive 窗口函数LEAD LAG FIRST_VALUE LAST_VALUE
窗口函数(window functions)对多行进行操作,并为查询中的每一行返回一个值. OVER()子句能将窗口函数与其他分析函数(analytical functions)和报告函数(repor ...
- Hive窗口函数
参考地址:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+WindowingAndAnalytics 环境准备: CRE ...
- Hive窗口函数之LAG、LEAD、FIRST_VALUE、LAST_VALUE的用法
一.创建表: create table windows_ss ( polno string, eff_date string, userno string ) ROW FORMAT DELIMITED ...
- Hive窗口函数最全案例详解
语法: 分析函数 over(partition by 列名 order by 列名 rows between 开始位置 and 结束位置) 常用分析函数: 聚合类 avg().sum().max(). ...
- Hive窗口函数案例详解
语法: 分析函数 over(partition by 列名 order by 列名 rows between 开始位置 and 结束位置) 常用分析函数: 聚合类 avg().sum().max(). ...
- Hive 窗口函数之 lead() over(partition by ) 和 lag() over(partition by )
lead函数用于提取当前行前某行的数据 lag函数用于提取当前行后某行的数据 语法如下: lead(expression,offset,default) over(partition by ... o ...
随机推荐
- 前端 CSS 边框
border 边框 solid 实体的 red 边框什么颜色 <!DOCTYPE html> <html lang="en"> <head> & ...
- 快速排序算法Java版
网上关于快速排序的算法原理和算法实现都比较多,不过java是实现并不多,而且部分实现很难理解,和思路有点不搭调.所以整理了这篇文章.如果有不妥之处还请建议.首先先复习一些基础. 1.算法概念. ...
- Django框架之模板语法(重要!)
一.什么是模板? 只要是在html里面有模板语法就不是html文件了,这样的文件就叫做模板. 二.模板语法分类 1.模板语法之变量:语法为 {{ }}: 在 Django 模板中遍历复杂数据结构的关键 ...
- The 2018 ACM-ICPC上海大都会赛 J Beautiful Numbers (数位DP)
题意:求小于等于N且能被自己所有位上数之和整除的数的个数. 分析:裸的数位dp.用一个三位数组dp[i][j][k]记录:第i位,之前数位之和为j,对某个mod余数为k的状态下满足条件的个数.这里mo ...
- ASP.MVC 项目中使用 UEditor 文本编辑器
1.下载UEditor 源文件,并导入项目中 2.添加项目中需要使用的CSS和JS //Ueditor 文本编辑器必备的StyleBundle和ScriptBundle StyleBundle ued ...
- 介绍Web项目中用到的几款JS日历日期控件和JS文本编辑框插件
第一款日历日期控件:layDate 官方网站:http://laydate.layui.com/ 第二款日历日期控件:my97 官方网站:http://www.my97.net/ 第三款 文本编辑器控 ...
- Secondary ,Supplementary alignment 和bwa mem的-M -Y参数
1.supplementary alignment supplementary alignment是指一条read的一部分和参考区域1比对成功,另一部分和参考区域2比对成功,参考区域1和参考区域2没有 ...
- 什么是MSB/LSB码?
MSB是Most Significant Bit的缩写,最高有效位.在二进制数中,MSB是最高加权位.与十进制数字中最左边的一位类似.通常,MSB位于二进制数的最左侧,LSB位于二进制数的最右侧. L ...
- idea中如何debug本地maven项目
方法一:使用maven中的jetty插件调试本地maven项目 1.打断点 2.右击“jetty:run”,选择Debug运行 3.浏览器发送http请求,开始调试 方法二:利用远程调试功能调试本地m ...
- Filter FASTA files
Use a regular expression for filtering sequences by id from a FASTA file, e.g. just certain chromoso ...