开窗函数over(),over()里面一般可以配合分组,排序,窗口范围三个条件使用,也可以单独用一个条件,格式如over(partition by order by between ... and)

通过partition by 关键字来对窗口分组,特殊注意:通过order by 来对order by字段排序后的行进行开窗,窗口范围如果没有设置,则每一行对应整张表。窗口函数一般和分析函数连用。

1、over()窗口函数的语法结构

分析函数 over(partition by 列名 order by 列名 rows between 开始位置 and 结束位置)

over()函数中包括三个函数:

order by是排序的意思

partition bypartition by可理解为group by 分组。over(partition by 列名)搭配分析函数时,分析函数按照每一组每一组的数据进行计算的。rows between 开始位置 and 结束位置是指定窗口范围,比如第一行到当前行。而这个范围是随着数据变化的。over(rows between 开始位置 and 结束位置)搭配分析函数时,分析函数按照这个范围进行计算的。

窗口范围说明:我们常使用的窗口范围是ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW(表示从起点到当前行),常用该窗口来计算累加。

窗口范围说明:我们常使用的窗口范围是ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW(表示从起点到当前行),常用该窗口来计算累加。

PRECEDING:往前

FOLLOWING:往后 CURRENT ROW:当前行 UNBOUNDED:起点(一般结合PRECEDING,FOLLOWING使用) UNBOUNDED PRECEDING 表示该窗口最前面的行(起点) UNBOUNDED FOLLOWING:表示该窗口最后面的行(终点)

比如说: ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW(表示从起点到当前行) ROWS BETWEEN 2 PRECEDING AND 1 FOLLOWING(表示往前2行到往后1行) ROWS BETWEEN 2 PRECEDING AND 1 CURRENT ROW(表示往前2行到当前行) ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING(表示当前行到终点)

2、示例

示例:现有一张表数据,三列,name,month,num

(1)使用开窗逐行累计求和(加不加排序不影响)

select * ,sum(num) over(ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) from fangwen;

select * ,sum(num) over( order by month ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) from fangwen;

 (2)分不同的name分组,逐行累计求和

select * ,sum(num) over(partition by name ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) total from fangwen;

不同的组之间互不影响。

(3)分组排序逐行求和

select * ,sum(num) over(partition by name order by month ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) total from fangwen;

(4)只排序,不分组,不指定窗口范围,结果会把排序列同样的作为一个窗口,后续的列会把前面的当成窗口行。

select *,sum(num) over (order by month) from fangwen;

3、常与over()一起使用的分析函数:

(1)聚合类

avg()、sum()、max()、min()

(2)排名类

row_number()按照值排序时产生一个自增编号,不会重复(如:1、2、3、4、5、6)

rank() 按照值排序时产生一个自增编号,值相等时会重复,会产生空位(如:1、2、3、3、3、6)

dense_rank() 按照值排序时产生一个自增编号,值相等时会重复,不会产生空位(如:1、2、3、3、3、4)

(3)其他类

lag(列名,往前的行数,[行数为null时的默认值,不指定为null]),可以计算用户上次购买时间,或者用户下次购买时间。或者上次登录时间和下次登录时间

lead(列名,往后的行数,[行数为null时的默认值,不指定为null])

ntile(n) 把有序分区中的行分发到指定数据的组中,各个组有编号,编号从1开始,对于每一行,ntile返回此行所属的组的编号

lag示例:

select * ,lag(time,1) over(partition by name order by time asc ) from leg_lead;

lead示例:

 select * ,lead(time,1) over(partition by name order by time asc ) from leg_lead;

ntile(n)一般用法按照排序之后把数据分成n组,好让你得到你要的组。

如下:

FIRST_VALUE 取分组内排序后,截止到当前行,第一个值

(4)开窗聚合函数和group by的共用

原始数据。

不带group by的开窗数据

select shop_id,user_id,count(1) over(partition by user_id) from tmp.practice;

带了group by的开窗数据

select shop_id,user_id,count(1) over(partition by user_id) from tmp.practice group by shop_id,user_id;

所以,看出带了group by之后,开窗函数的作用范围是,group by之后的数据了,不再是原始数据。

结论:group by和over()配合起来使用的数据生成的流程是,先通过group by进行分组聚合,over函数是作用在group by所生成的数据之上的。

hive的开窗函数篇相关推荐

  1. 2021年大数据Hive(七):Hive的开窗函数

    全网最详细的Hive文章系列,强烈建议收藏加关注! 后面更新文章都会列出历史文章目录,帮助大家回顾知识重点. 目录 系列历史文章 前言 Hive的开窗函数 一.窗口函数 ROW_NUMBER,RANK ...

  2. 大数据Hive(七):Hive的开窗函数

    文章目录 Hive的开窗函数 一.窗口函数 ROW_NUMBER,RANK,DENSE_RANK 1.数据准备

  3. Hive SQL开窗函数详解

    Hive 开窗函数 group by 是分组函数,一组出来一个数据 over() 开窗,针对每一条数据,都有一个独立的组 mk 3 jk 3 mk 3 select orderdate,cost,su ...

  4. hive窗口函数(开窗函数)

    一.[窗口函数概述] 窗口函数(Window functions)是一种SQL函数,非常适合于数据分析,因此也叫做OLAP函数,其最大特点是:输入值是从SELECT语句的结果集中的一行或多行的&quo ...

  5. hive sql—开窗函数—累积求和和滑动求和

    1.数据介绍 数据集有三列数据,姓名.月份和数量: 图1 2.累积求和 使用sum()函数和over()来实现,如下: sum(需要求和的列) over(partition by 分组列 order ...

  6. hive中开窗函数 :percent_rank()的含义

    这是hql语句 查询结果 percent_rank() 含义就是 当前行-1 / 当前组总行数-1 比如第一行: 1-1/14-1 = 0 : 第二行:2-1/14-1=0.07692,,,,,,

  7. hive中的开窗函数

    目录 count开窗函数 sum开窗函数 min开窗函数 max开窗函数 avg开窗函数 first_value开窗函数 last_value开窗函数 lag开窗函数.lead开窗函数 cume_di ...

  8. Hive第六天——Hive函数(开窗函数之累计统计)

    本文部分参考自:https://blog.csdn.net/qq_23897391/article/details/100558433 Hive第六天--Hive函数 自己的话:千里之行,始于足下. ...

  9. [Hive]-函数篇

    1.函数分类 UDF 单进单出函数 UDAF 多进单出函数(比如Count,Sum...多个记录输出一个结果) UDTF 单进多出函数(比如explode,一个记录输出多行结果) 2.操作符 A = ...

最新文章

  1. JQuery Tables 的应用(一)
  2. php mysql log文件怎么打开_如何查看mysql的日志文件
  3. iOS 开发中的MVVM介绍(译)
  4. git中统计代码提交数
  5. SpringBoot_日志-日志框架分类和选择
  6. 箱式图 分组_小白学R(三):重复测量数据的箱式图上的p值如何改大小呢?
  7. open-falcon
  8. C++成员访问限定符 private public
  9. LeetCode 第 201 场周赛(304/5614,前5.42%)
  10. python 实例 cadu_【示例详解】AutoCAD处理控件Aspose.CAD 8月新更!支持加载大型DWG文件...
  11. vue element form 表单
  12. 【20171227】json
  13. MySql存储过程总结
  14. 纯洁的心--佩雷尔曼
  15. 联想电脑尺寸在哪里看_联想电脑型号怎么查看【详细介绍】
  16. 苹果切换输入法_忍不住分享!朋友圈发长文神器来了 —— 不折叠输入法
  17. web网页设计实例作业 ——电影泰坦尼克号(4页) HTML+CSS+JavaScript 学生HTML个人网页作业作品下载 个人网页设计制作 大学生个人网站作业模板 简单个人网页制作
  18. 智能结算新方案,这个商品识别算法你值得拥有!
  19. activiti设置和使用启动人;activiti:initiator的作用及其使用
  20. ArcMap中的各种GIS文件的变换(img转tif,tif坐标系转换,shp坐标系转换)

热门文章

  1. c语言编写8个发光二极管循环右移,1、P1 口做输出口,接八只发光二极管,编写程序,使发光二极管循环点亮。...
  2. 2019年一月十日 Mixin Network 资产持有量快照
  3. python hank_python学习路线
  4. 计算机显示器不显示图像,电脑显示器没有画面的解决方法
  5. Kaggle赛题解析:Google手语识别
  6. 如何将Excel中的数据粘贴到cxGrid中
  7. UVa:10074 Take the Land
  8. 一些WM消息与其相应WPARAM,LPARAM的定义
  9. 0逻辑comment--新世界大门
  10. Matplotlib图形配置