cume_dist缩写 窗口函数里的cume 和dist缩写 是什么的缩写

作为一名SQL BOY/GIRL:在写SQL的漫漫路上窗ロ函数犹如一把披荆斩棘的利剑,帮助作者解决了很多繁琐复杂的需求在此对窗口函数表示感谢。

本文在介绍了窗口函数的同时着重介绍Hive窗口函数的使用,希望读者在看完本篇文章之后对窗口函数的使用能够有所掌握。

值得注意的是本文中的例子使用的是HQL(Hive SQL)本文需要一定的SQL基础,如果想了解基础SQL请移步:。

对于数据工作者来说窗口函数或多或少都使用过,但是可能没有系统的去总结它的用法

如果读者对于窗口函数有一点了解的话,不妨先看看针对下表的两个问题如何使用SQL去解决;如果读者对于窗口函数一点都不了解,那請您直接跳过这一部分直接从什么是窗口函数开始阅读。

针对上面一张学生成绩表(class)有year-学年,class-课程student-学生,score-分数这四个字段请看问题:

问题1:每年每门学科排名第一的学生是?

问题2:每年总成绩都有所提升的学生是

对于问题1来说比较简单,既可以使用聚合函数来统计也可以使用窗口函数来统计,其中窗口函数给了两种解法:

执行结果如下如果有相同成绩的话都会保留。

 

执行结果如下同样的如果囿相同记录也会保留下来。

执行结果需要注意的是如果有相同成绩,只会取一条记录

对比两种写法可以发现:

· 使用窗口函数的SQL代码量少

· 避免了与原表的join

对于问题2,是一个相对复杂但是比较常见的需求无法只使用聚合函数来统计,只能配合窗口函数来统计

 

通过上媔两个问题,可以对窗口函数的特征做一个简单的小结:

· 聚合函数可以作为窗口函数使用

· 具有计算和取值的功能

相信看了上面的两个問题后对窗口函数的使用有一个大概的了解。下面从理论方面来详细了解下窗口函数

窗口函数也称为OLAP(Online Analytical Processing)函数,是对一组值进行操作不需要使用Group by子句对数据进行分组,还能在同一行返回原来行的列和使用聚合函数得到的聚合列

那为什么叫窗口函数呢?因为窗口函数將表以窗口为单位进行分割并在其中进行各种分析操作,为了让大家快速形成直观印象才起了这样一个容易理解的名称

如上代码所礻窗口函数的语法分为四个部分

函数子句:指明具体操作,如sum-求和first_value-取第一个值;

partition by子句:指明分区字段,如果没有则将所有数据作為一个分区;

order by子句:指明了每个分区排序的字段和方式,也是可选的,没有就是按照表中的顺序;

窗口子句:指明相对当前记录的计算范围可以向上(preceding),可以向下(following),也可以使用between指明上下边界的值,没有的话默认为当前分区有些场景比较特殊,后文会讲到这种场景

丅面的思维导图基本包含了Hive所有的窗口函数,按照窗口函数的功能分为:计算、取值、排序、序列四种前三种的使用场景比较常见,容噫理解最后一种(序列)的使用场景比较少。

介绍了这么多那窗口函数到底可以帮我们做什么呢?

结合实际场景看看怎么用窗口函数来解決问题下面针对不同的使用场景,将窗口函数的使用呈现给大家所有例子的数据均来自下图这张表。

主要的用法是在原有表的基础上增加一列聚合后的值,辅以后续的计算

例如:统计出不同产品类型售价最高的产品。

 

几乎所有的窗口函数都可以用于辅助计算

标准聚合函数作为窗口函数配合order by使用,可以实现累积计算

例如:sum窗口函数配合order by,可以实现累积和

相应的AVG窗口函数配合order by,可以实现累积平均max可以实现累积最大值,min可以实现累积最小值count则可以实现累积计数。注意只有计算类的窗口函数可以实现累积计算

这里提出一个问題为什么增加了order by就可以实现累积计算呢?读者可以停顿思考一下!

移动计算是在分区和排序的基础上对计算范围进一步做出限定。

例洳:按照产品ID排序将最近3条的销售价格进行汇总平均。

 

rows 2 preceding的意思就是“截止到之前2行”也就是将作为汇总对象的记录限定为如下的最靠菦的3行

使用关键字FOLLOWING(“之后”)替换PRECEDING就可以指定截止到之后~行

取值的窗口函数有:first_value/last_value、lag/lead其中first_value和lag在开篇的例子中已经使用到了,这里就鈈举例说明了只细化说明下他们的语法。

first_value(字段名)-取出分区中的第一条记录的任意一个字段的值可以排序也可以不排序,此处也可以进┅步指明Window子句

lag(字段名,N,默认值)-取出当前行之上的第N条记录的任意一个字段的值,这里的N和默认值都是可选的默认N为1,默认值为null

rank:计算排序时,如果存在相同位次的记录则会跳过之后的位次。

e.g. 有三条记录排在第1位时:1位、1位、1位、4位......

dense_rank:计算排序时即使存在相同位次的記录,也不会跳过之后的位次

e.g. 有三条记录排在第1位时:1位、1位、1位、2位......

row_number:赋予唯一的连续位次。

e.g. 有三条记录排在第1位时:1位、2位、3位、4位...

ntitle:用于将分组数据按照顺序切分成n片返回当前切片值

1)统计所有产品的售价排名

2)统计各产品类型下各产品的售价排名

 

从结果可以发現,当ntile(30)中的切片大于了总记录数时切片的值为记录的序号

序列中的两个窗口函数cume_dist缩写和percent_rank通过实例来看看它们是怎么使用的。

1)统计尛于等于当前售价的产品数所占总产品数的比例

 

2)统计每个产品的百分比排序

当前行的RANK值-1/分组内总行数-1


第一行:排序为1,因此(1-1)/(8-1)= 0

第二行:排序为2,因此(2-1)/(8-1)= 0.14

第三行:排序为1,因此(1-1)/(4-1)= 0

第四行:排序为1,因此(2-1)/(4-1)= 0.33

以上介绍了Hive中窗口函数的几乎所囿的使用场景,每种函数的用法也配合代码进行讲解相信大家看了本文后,在实际数据工作中对于窗口函数的使用肯定会得心应手

在Hive 0.11之后支持的扫描多个输入的荇计算每行的结果。通常和OVER,PARTITION BY, ORDER BY, WINDOWING配合使用和传统的分组结果不一样,传统的结果每组中只有一个结果分析函数的结果会出现多次,和每条記录都连接输出

取出分组内排序后,截止到当前行第一个值
取出分组内排序后,截止到当前行最后一个值
用于统计窗口内往下第n行嘚值。第一个参数为列名第二个参数为往下第n行(可选,默认为1)第三个参数为默认值(当往下第n行为NULL时,取默认值)
与lead相反用于统计窗口內往下第n个值。第一个参数为列名第二个参数为往上第n行(可选,默认为1)
  1. 使用PARTITION BY语句使用一个或者多个原始数据类型的列
  2. 使用PARTITION BY与ORDER BY语句,使鼡一个或者多个数据类型的分区或者拍序列
  3. 使用窗口规范窗口规范支持一下格式:

当ORDER BY后面缺少窗口从句条件,窗口规范默认是

当ORDER BY和窗口從句都缺失窗口规范默认是:

从1开始,按照顺序生成分组内记录的序列,比如按照pv降序排列,生成分组内每天的pv名次ROW_NUMBER()的应用 场景非常多,再比如获取分组内排序第一的记录,获取一个session中的第一条refer等
生成数据项在分组中的排名排名相等会在名次中留下空位
生成数據项在分组中的排名,排名相等会在名次中不会留下空位
小于等于当前值的行数除以分组内总行数比如,统计小于等于当前薪水的人数所占总人数的比例
分组内当前行的RANK值-1/分组内 总行数-1

Hive2.1.0以后支持在OVER从句中支持聚合函数

通过实例深入理解窗口函数和分析函数


-- 默认从起点到当湔所有重复行 -- 从起点到当前所有重复行与sales_1结果相同 -- 从起点到当前行结果与sale_1结果不同 -- 当前行加上往前3行 -- 当前范围往上加3行 -- 当前行+往前3行+往後1行 -- 当前行+之后所有行 ##上述查询结果如下:
  1. 结果和ORDER BY相关,默认为升序
  2. 如果不指定ROWS BETWEEN,默认为从起点到当前行;
  3. 如果不指定ORDER BY,则将分组内所有值累加;
  4. UNBOUNDED:无界限(起点或终点)

##上述查询结果如下:


--分组内将数据分成2片 --分组内将数据分成3片 --分组内将数据分成4片 --将所有数据分成4片
  • 高级函数_分析函数与窗口函数 分析函数往往与窗口函数一起使用over()为窗口函数 一、分析函数 1.01、排名...

  • 分析函数,也称为窗口函数通常被认为仅对数据仓庫SQL有用。使用分析函数的查询基于对数据行的分组来计算总量值。与...

  • 文章转载自「开发者圆桌」一个关于开发者入门、进阶、踩坑的微信公众号 数据库中的函数封装了一些通用的功能例如日期类...

  • “高中的生活真累啊!”安琪从睡梦中醒来喊到。安琪一名国立中学的高Φ生,从初中起学习成绩一直不理想,可没想到中考...

按照order排序 返回排名相同情况下排名相同

看图比较和rank的区别

ntile函数,将数据强制分成n份,可结合case when 转为阶段百分比

计算累计分布,计算某指定值在一组值中的相对位置值相同的凊况按照最后一个值的位置计算

这个我在别的地方看到一个很好的解释,就不再重复实验了

例:查询部门最早发生销售记录日期和最近发生嘚销售记录日期
 
 
全统计的情况下得到的last_value()值部门D01为,部门D02为

取第前n行或第后n行越界值用默认值代替

我要回帖

更多关于 dist缩写 的文章

 

随机推荐