前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Hive窗口函数

Hive窗口函数

作者头像
孙晨c
发布于 2020-10-10 09:26:01
发布于 2020-10-10 09:26:01
1K00
代码可运行
举报
文章被收录于专栏:无题~无题~
运行总次数:0
代码可运行

@

目录

官方文档地址

Hive官网,点我就进 oracle,sqlserver都提供了窗口函数,但是在mysql5.5和5.6都没有提供窗口函数!

窗口函数: 窗口+函数

  • 窗口: 函数运行时计算的数据集的范围
  • 函数: 运行的函数! 仅仅支持以下函数:

Windowing functions

  • LEAD (scalar_expression [,offset] [,default]): 返回当前行以下N行的指定列的列值!如果找不到,就采用默认值
  • LAG (scalar_expression [,offset] [,default]): 返回当前行以上N行的指定列的列值!如果找不到,就采用默认值
  • FIRST_VALUE(列名,[false(默认)]):返回当前窗口指定列的第一个值,第二个参数如果为true,代表加入第一个值为null,跳过空值,继续寻找!
  • LAST_VALUE(列名,[false(默认)]):返回当前窗口指定列的最后一个值,第二个参数如果为true,代表加入第一个值为null,跳过空值,继续寻找!

统计类的函数(一般都需要结合over使用):min,max,avg,sum,count

排名分析:

  • RANK
  • ROW_NUMBER
  • DENSE_RANK
  • CUME_DIST
  • PERCENT_RANK
  • NTILE

注意:不是所有的函数在运行都是可以通过改变窗口的大小,来控制计算的数据集的范围!所有的排名函数和LAG,LEAD,支持使用over(),但是在over()中不能定义 window_clause

格式: 函数 over( partition by 字段 ,order by 字段 window_clause )

窗口的大小可以通过windows_clause来指定:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(rows | range) between (unbounded | [num]) preceding and ([num] preceding | current row | (unbounded | [num]) following)
(rows | range) between current row and (current row | (unbounded | [num]) following)
(rows | range) between [num] following and (unbounded | [num]) following

特殊情况:

  • ①在over()中既没有出现windows_clause,也没有出现order by,窗口默认为rows between UNBOUNDED PRECEDING and UNBOUNDED FOLLOWING
  • ②在over()中(没有出现windows_clause),指定了order by,窗口默认为rows between UNBOUNDED PRECEDING and CURRENT ROW

窗口函数和分组有什么区别?

  • ①如果是分组操作,select后只能写分组后的字段
  • ②如果是窗口函数,窗口函数是在指定的窗口内,对每条记录都执行一次函数
  • ③如果是分组操作,有去重效果,而partition不去重!

练习

(9) 查询前20%时间的订单信息 精确算法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 select *
 from
 (select name,orderdate,cost,cume_dist() over(order by orderdate ) cdnum
 from  business) tmp
 where cdnum<=0.2

不精确计算:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 select *
 from
 (select name,orderdate,cost,ntile(5) over(order by orderdate ) cdnum
 from  business) tmp
 where cdnum=1

(8)查询顾客的购买明细及顾客最近三次cost花费

最近三次: 当前和之前两次当前+前一次+后一次

当前和之前两次:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select name,orderdate,cost,sum(cost) over(partition by name order by orderdate rows between 2 PRECEDING and CURRENT  row) 
 from business 

当前+前一次+后一次:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select name,orderdate,cost,sum(cost) over(partition by name order by orderdate rows between 1 PRECEDING and 1  FOLLOWING) 
 from business

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select name,orderdate,cost,cost+
 lag(cost,1,0) over(partition by name order by orderdate )+
 lead(cost,1,0) over(partition by name order by orderdate )
 from business

(7) 查询顾客的购买明细及顾客本月最后一次购买的时间

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select name,orderdate,cost,LAST_VALUE(orderdate,true) over(partition by name,substring(orderdate,1,7) order by orderdate rows between CURRENT  row and UNBOUNDED  FOLLOWING) 
 from business 

(6) 查询顾客的购买明细及顾客本月第一次购买的时间

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select name,orderdate,cost,FIRST_VALUE(orderdate,true) over(partition by name,substring(orderdate,1,7) order by orderdate ) 
 from business

(5) 查询顾客的购买明细及顾客下次的购买时间

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 select name,orderdate,cost,lead(orderdate,1,'无数据') over(partition by name order by orderdate ) 
 from business

(4)查询顾客的购买明细及顾客上次的购买时间

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  select name,orderdate,cost,lag(orderdate,1,'无数据') over(partition by name order by orderdate ) 
 from business

(3)查询顾客的购买明细要将cost按照日期进行累加

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select name,orderdate,cost,sum(cost) over(partition by name order by orderdate ) 
 from business

(2)查询顾客的购买明细及月购买总额

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 select name,orderdate,cost,sum(cost) over(partition by name,substring(orderdate,1,7) ) 
 from business

(1)查询在2017年4月份购买过的顾客及总人数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select name,count(*) over(rows between UNBOUNDED  PRECEDING and UNBOUNDED  FOLLOWING)
from business
where substring(orderdate,1,7)='2017-04'
group by name

等价于

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select name,count(*) over()
from business
where substring(orderdate,1,7)='2017-04'
group by name
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-10-07 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Hive补充之窗口函数
窗口函数 1、hive窗口函数语法 hive中的窗口函数over() ,over()窗口函数的语法结构
Maynor
2021/04/09
1.1K0
Hive 窗口函数最全讲解和实战
在深入研究Over字句之前,一定要注意:在SQL处理中,窗口函数都是最后一步执行,而且仅位于Order by子句之前 可以想象成sql的输出结果,就是窗口函数输入的结果。
kk大数据
2019/12/18
2.1K0
大数据技术之_08_Hive学习_03_查询+函数
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Select 查询语句语法:
黑泽君
2019/03/11
1.9K0
大数据技术之_08_Hive学习_03_查询+函数
大数据快速入门(10):Hive窗口函数
首先,需要认识到,窗口函数并不是只有 hive 才有的,SQL 语法标准中,就有窗口函数。
kk大数据
2020/11/11
2.5K0
Hive 高频考点讲解
Hive 是 FaceBook 开源的一款基于 Hadoop 数据仓库工具,它可以将结构化的数据文件映射为一张表,并提供类SQL查询功能。
sowhat1412
2022/09/20
1.2K0
Hive 高频考点讲解
快速学习-Hive查询
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Select 查询语句语法:
cwl_java
2020/02/21
1.9K0
快速学习-Hive查询
Hive函数
**CONCAT_WS(separator, str1, str2,...):**多字符串拼接
ha_lydms
2023/11/19
4771
Hive函数
Hive常用窗口函数实战
本文介绍了Hive常见的序列函数,排名函数和窗口函数。结合业务场景展示了Hive分析函数的使用
Eights
2020/07/13
2.8K0
Hive SQL 大厂必考常用窗口函数及相关面试题
二、窗口函数的基本用法 1.基本语法 2.设置窗口的方法 1)window_name 2)partition by 子句 3) order by子句 4)rows 指定窗口大小 3.开窗函数中加order by 和 不加 order by的区别
王知无-import_bigdata
2022/11/11
3.8K0
Hive SQL 大厂必考常用窗口函数及相关面试题
Oracle SQL 基础:窗口函数(一)over()函数
窗口函数的名字是over()函数,常用的有两个属性partition by和order by,partition by类似于group by,我们通常将group by叫做分组,而partition by称作分区。
SQLplusDB
2022/08/19
9510
深入MySQL窗口函数:原理和应用
窗口函数(Window Functions)是SQL标准中的一个高级特性,它允许用户在不改变查询结果集行数的情况下,对每一行执行聚合计算或其他复杂的计算。这些计算是基于当前行与结果集中其他行之间的关系进行的。窗口函数特别适用于需要执行跨多行的计算,同时又想保持原始查询结果集的行数不变的场景。
公众号:码到三十五
2024/03/19
2.6K0
深入MySQL窗口函数:原理和应用
MySQL8新特性窗口函数详解
本文博主给大家详细讲解一波 MySQL8 的新特性:「窗口函数」,相信大伙看完一定能有所收获。
wayn
2023/06/14
4600
MySQL8新特性窗口函数详解
MySQL8新特性窗口函数详解
MySQL8 窗口函数是一种特殊的函数,它可以在一组查询行上执行类似于聚合的操作,但是不会将查询行折叠为单个输出行,而是为每个查询行生成一个结果。窗口函数可以用来处理复杂的报表统计分析场景,例如计算移动平均值、累计和、排名等。其中博主认为它展现的主要威力在于「它能够让我们在不修改原有语句输出结果的基础上,直接添加新的聚合字段」。
wayn
2023/08/28
2880
MySQL8新特性窗口函数详解
postgreSQL窗口函数总结
1、我们都知道在SQL中有一类函数叫做聚合函数,例如sum()、avg()、max()等等,这类函数可以将多行数据按照规则聚集为一行,一般来讲聚集后的行数是要少于聚集前的行数的,但是有时我们想要既显示聚集前的数据,又要显示聚集后的数据,这时我们便引入了窗口函数。
小徐
2020/02/16
2.7K0
postgreSQL窗口函数总结
窗口函数大揭秘!轻松计算数据累计占比,玩转数据分析的绝佳利器
2. PostgreSQL(>=11) 3. SQL Server(>=2012) 4. Oracle(>=8i) 5. SQLite(>=3.28.0)
葡萄城控件
2023/10/16
3640
窗口函数大揭秘!轻松计算数据累计占比,玩转数据分析的绝佳利器
Hive窗口函数/分析函数详解
在sql中有一类函数叫做聚合函数,例如sum()、avg()、max()等等,这类函数可以将多行数据按照规则聚集为一行,一般来讲聚集后的行数是要少于聚集前的行数的。但是有时我们想要既显示聚集前的数据,又要显示聚集后的数据,这时我们便引入了窗口函数。窗口函数又叫OLAP函数/分析函数,窗口函数兼具分组和排序功能。
五分钟学大数据
2021/03/04
8890
Hive窗口函数/分析函数详解
MySQL8 窗口函数
MySQL8 还是有很多重量级变化的,一些底层优化大家在使用中有时候不易察觉,但是有一些用法,还是带给我们耳目一新的感觉,今天松哥和大家分享一下 MySQL8 里边的窗口函数。
程序猿川子
2024/11/08
1410
MySQL8 窗口函数
SQL 窗口函数的优化和执行
窗口函数(Window Function)是 SQL2003 标准中定义的一项新特性,并在 SQL2011、SQL2016 中又加以完善,添加了若干处拓展。窗口函数不同于我们熟悉的普通函数和聚合函数,它为每行数据进行一次计算:输入多行(一个窗口)、返回一个值。在报表等分析型查询中,窗口函数能优雅地表达某些需求,发挥不可替代的作用。
大数据老哥
2021/03/08
1.9K0
SQL 窗口函数的优化和执行
SQL 窗口函数的优化和执行
窗口函数(Window Function)是 SQL2003 标准中定义的一项新特性,并在 SQL2011、SQL2016 中又加以完善,添加了若干处拓展。窗口函数不同于我们熟悉的普通函数和聚合函数,它为每行数据进行一次计算:输入多行(一个窗口)、返回一个值。在报表等分析型查询中,窗口函数能优雅地表达某些需求,发挥不可替代的作用。
SQL数据库开发
2024/04/24
1960
SQL 窗口函数的优化和执行
SQL干货 | 窗口函数的使用
Mysql从8.0版本开始,也和Sql Server、Oracle一样支持在查询中使用窗口函数,本文将根据官方文档,通过实例介绍窗口函数并举例分组排序函数的使用。
Python数据科学
2019/12/31
1.5K0
SQL干货 | 窗口函数的使用
相关推荐
Hive补充之窗口函数
更多 >
LV.0
这个人很懒,什么都没有留下~
作者相关精选
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验