当前位置: 首页 > article >正文

hive窗口函数记录

记录工作中和学习中的窗口函数,方便以后使用,本记持续更新和完善,版本:231019

文章目录

    • 1.什么是窗口函数
    • 2.窗口函数的表达式
    • 3.窗口函数的类型
      • 1) 排名函数
      • 2) 聚合函数
      • 3) 跨行取值函数
    • 4.[frame]滑动窗口
      • 1)窗口选择的两种模式:
      • 2)滑动模式的两种表达式

1.什么是窗口函数

窗口函数,能为每行数据划分一个窗口,然后对窗口范围内的数据进行计算, 最后将计算结果返回给该行 数据 。

使用场景:在一条数据中既想要展示明细,又想要体现一部分数据整体的效果,就可以使用窗口函数。这也是它和聚合函数的不同之处是:对于每个组返回多行,而聚合函数对于每个组只返回一行。

如下图式例:既想要展示sc表每个sid学生的成绩,又想要展示展示每个学生在整个年级的排名情况,rw即为窗口所展示的数据

SELECT *,row_number() over( ORDER BY score desc ) as rw FROM sc

在这里插入图片描述

2.窗口函数的表达式

function(args) over([partition by expression] [order by [asc|desc]] [frame])

表达式解析:
function:<窗口函数名>
over :”关键字 用于指定窗口的范围
(partition by: <用于分组的列名> order by <用于排序的列名>)
asc|desc:升序和降序,不写默认是升序

frame:计算行数的范围(详细请看下面第四点:[frame]滑动窗口)

3.窗口函数的类型

1) 排名函数

row_number()、 rank()、dense_rank() 
row_number()排序相同时不会重复,会根据顺序排序 即 1,2,3
rank()排序相同时会重复,同一排名有几个,后面排名就会跳过几次,即 1,1,3
dense_rank()排序相同时会重复,排名相同的名次一样,且后面名次不跳跃,即1,1,2

示例:

select *,
row_number() over(partition by cid order by score desc) rw,
rank() over(partition by cid order by score desc) rk,
dense_rank() over(partition by cid order by score desc) dense_rk
from sc 
where cid = 01

在这里插入图片描述

2) 聚合函数

max()、 min()、sum()、avg()、count()
max ()最大值
min ()最小值
sum ()求和
avg()求平均值
count()计数

3) 跨行取值函数

  lead()、lag()

语法:

lead(expression,n)获取当前行的下边n行 、n个字段的值
lag(expression,n)获取当前行的上边n行 、n个字段的值

expression:行数命
n:代表便宜量,想要偏移的行数

实例如下:

select * from active

select 
  uid,
	dt,
	lag(dt,1) over(PARTITION by uid ORDER BY dt) lg,
	lead(dt,1) over(PARTITION by uid ORDER BY dt) ld
from active

在这里插入图片描述
使用范围:可以对数据进行同步和环比,针对

4.[frame]滑动窗口

function(args) over([partition by expression] [order by [asc|desc]] [frame])

1)窗口选择的两种模式:

rows模式按物理行进行划分
range模式按数据模式进行划分

2)滑动模式的两种表达式

{range|row}frame_start : 从自定行开始到当前行结束
{range|row}between frame_start and frame_end: 指定开始行和结束行

滑动行范围的常用表达式:

表达式解析
unbounded preceding从开始行
expression preceding从当前行往前推 n 行 (expression 写为整数)
current row当前行
expression following从当前行往后推n行 (expression 写为整数)
unbounded following到结束行

示例:通过改变row参数,改变窗口的大小

图一:
select * from sc 

图二:窗口默认当前行之前的所有行
select 
	sid,
	cid,
  sum(score) over(partition by sid)
from sc

图三:使用row使窗口变成当前行的前一行到当前行,窗口只有两行,得出图三的效果
select 
	sid,
	cid,
  sum(score) over(partition by sid  rows 1  preceding)
from sc

在这里插入图片描述
在这里插入图片描述

#当order by 后面缺少窗口从句条件,窗口规范默认是 从当前行到当前行以上的所有行
rows between unbounded preceding and current
#当order by 和 窗口从句条件都缺失,窗口范围默认 当前行上面所有行以及下面的所有行
rows between unbounded preceding and unbounded following


http://www.kler.cn/a/106003.html

相关文章:

  • django从入门到实战(三)——CBV视图介绍
  • 【MySQL】InnoDB内存结构
  • mybatis-plus: mapper-locations: “classpath*:/mapper/**/*.xml“配置!!!解释
  • html + css 自适应首页布局案例
  • 加速 AI 创新:引入 Elastic AI 生态系统
  • AtCoder Beginner Contest 380(A-F)
  • 如何开通 Medium会员
  • Camera2开发基础知识篇——手机影像参数
  • 四、W5100S/W5500+RP2040树莓派Pico<TCP Server数据回环测试>
  • idea 中配置 maven
  • 华为OD机考算法题:计算最大乘积
  • ED8000 地下电子标签探测器|标识器探测仪深度测量校准操作说明
  • 如何在Pacman (Arch Linux)中用Configuration设置HTTP?
  • 取证之2021年第三届长安杯电子数据取证竞赛
  • 14.力扣c++刷题-->有效括号
  • MemCache与Redis如何选择?
  • 基于.Net CEF 实现 Vue 等前端技术栈构建 Windows 窗体应用
  • 【机器学习合集】优化目标与评估指标合集 ->(个人学习记录笔记)
  • 简单的前端语言
  • 21.9 Python 使用Selenium库
  • 用爬虫代码爬取高音质音频示例
  • 微信native支付对接
  • 计算机网络-应用层(2)
  • V8 引擎中的垃圾收集器
  • 202212 青少年等级考试机器人实操真题六级试卷
  • 全自动洗衣机什么牌子好?迷你洗衣机品牌推荐