SQL窗口分析函数使用详解系列三之偏移量类窗口函数

sql · 浏览次数 : 0

小编点评

**HiveSQL窗口分析函数** **定义** * **偏移量类窗口函数**:使用 `lead() over()`、`lag() over()` 或 `first_value()` 函数来计算数据中前后数据之间的差值。 **语法** ```sql window_function_name(column_name, offset, default_value) over (partition by partition_col order by order_col) ``` **参数** * **column_name:**要计算差值的列名。 * **offset:**偏移量,表示要获取的偏移量(默认值为 1)。 * **default_value:**当没有找到前一个行时返回的值。 **示例** ```sql -- 偏移量类窗口函数 select id, client, age, lead(age, 1, 10) over (partition by client order by id) as lag_1_age from temp.user_info where id <= 10 order by id; -- lead 函数 select id, client, age, lead(age, 2, 10) over (partition by client order by id) as lead_2_age from temp.user_info where id <= 10 order by id; ``` **使用** * **最常见的使用场景:**当数据最细粒度为天粒度时,查询该用户的前一天行为和今天行为的差值或相比上一日上涨或下降百分比等。 **其他数据库** | 数据库 | SQL窗口函数 | |---|---| | SparkSQL | lead() over () | | FlinkSQL | lead | | MySQL8 | LEAD | | Oracle | LEAD | | SQL Server | LEAD |

正文

1.综述

本文以HiveSQL语法进行代码演示。

对于其他数据库来说同样也适用,比如SparkSQL,FlinkSQL以及Mysql8,Oracle,SqlServer等传统的关系型数据库。

已更新第一类聚合函数类,点击这里阅读 ①SQL窗口函数系列一之聚合函数类

SQL窗口函数系列二之分组排序窗口函数

本节介绍Hive窗口分析函数中的第三类窗口函数:偏移量类窗口函数。

在实际的应用场景中,顾名思义,偏移量分析函数主要应用于求解和指定偏移数据的差值。例如和上一行数据差值,和下一行数据差值。

有什么实际意义呢?例如,每行数据是天粒度的,那么上下行的差值计算就是前后天的数据增长量或者减少量,比left join,right join的方式更为简单,效率更高。

1.1 偏移量类窗口函数

lead() over();
lag() over();
first_value() over();

1.2 窗口函数语法

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

具体解析

over()括号内为空时,是直接进行计算。

其中partition by 列名 是按指定列进行分组,进而进行计算。

最后的order by 列名 是按照指定列进行排序,进而进行计算。

1.3 基础数据准备

create table if not exists temp.user_info (
  `id` bigint comment '用户id',
  `client` string comment '客户端',
  `gender` int comment '性别,0女1男',
  `constellation` string comment '星座',
  `age` int comment '年龄',
  `pv` bigint comment '访问量',
  `chat_num` bigint comment '聊天次数'
) comment '用户信息测试临时表' 

数据预览

id client gender constellation age pv chat_num
1 ios 0 处女座 29 174 3
2 ios 1 双鱼座 26 263 2
3 android 1 双鱼座 35 232 39
4 ios 1 水瓶座 32 57 3
5 ios 1 射手座 33 67 6
6 ios 1 双子座 36 81 5
7 ios 1 狮子座 29 68 4
8 ios 1 狮子座 28 19 3
9 ios 0 射手座 32 479 2
10 ios 1 白羊座 26 255 36

2.各偏移量函数的使用

2.1 lag

  • 功能

Lag函数用于获取指定列的前n(取决于偏移量的设置)个行的值,按照我们设定的分区以及排序规则。

  • 语法
lag(column_name, offset, default_value) over (partition by partition_col order by order_col)

column_name要查询的列名

offset 要查找的偏移量,即要获取的行数的偏移量,默认为1,例如往前1行或者n行。

default_value 一个可选的默认值(当没有找到前一个行时返回的值

  • 示例

按客户端分组,按id排序,取出上一行的年龄。

select id,client,age,lag(age,1,10) over(partition by client order by id) as lag_1_age from temp.user_info
where id <= 10
order by id;

数据结果

id client age lag_1_age
1 ios 29 10
2 ios 26 29
3 android 35 10
4 ios 32 26
5 ios 33 32
6 ios 36 33
7 ios 29 36
8 ios 28 29
9 ios 32 28
10 ios 26 32

可以看到id为1的用户没有上一行,所以取到的值为我设置的默认值10.如果不设置默认值,返回null

Id 为2的用户渠道的偏移值是id为1的用户的年龄。

  • 拓展使用

偏移量最常见的使用是当数据最细粒度为天粒度时,查询该用户的前一天行为和今天行为的差值或者相比上一日上涨或者下降百分比等。伪SQL

-- 这里省略了偏移量和默认值
select id,pv,dt,pv-lag_pv as gap_pv  -- 当日和上一日的pv差值 
from (
		select id,pv,dt,lag(pv) over(partition by id order by dt) as lag_pv from temp.user_pv_info
) a

2.2 lead

  • 功能

和lag类似,却刚好相反。是取向下的偏移量的值。进而进行差值计算等。

用于获取指定列的后n(取决于偏移量的设置)个行的值,按照我们设定的分区以及排序规则。

  • 语法
lead(column_name, offset, default_value) over (partition by partition_col order by order_col)

column_name要查询的列名

offset 要查找的偏移量,即要获取的行数的偏移量,默认为1,例如往前1行或者n行。

default_value 一个可选的默认值(当没有找到前一个行时返回的值)

  • 示例

按客户端分组,按id排序,取出下二行的年龄。

select id,client,age,lead(age,2,10) over(partition by client order by id) as lead_2_age from temp.user_info
where id <= 10
order by id;

数据结果

id client age lead_2_age
1 ios 29 32
2 ios 26 33
3 android 35 10
4 ios 32 36
5 ios 33 29
6 ios 36 28
7 ios 29 32
8 ios 28 26
9 ios 32 10
10 ios 26 10

如上,我把偏移量设置为2,可以看到id为9和10的向下两行没有数据。

  • 拓展使用

和lag使用场景一致,很多场景lag和lead都可以互换,需要设置排序是正序或者倒序的区别。

2.3 first_value

  • 功能

first_value用于返回分组中的第一个值,按指定的排序列。我们在使用中可以根据特定的排序规则来确定和查询获取每个分组的第一个值

  • 语法
first_value(expression) over(
	[partition by 列名1,列名2]
  [order by 列名3,列名4]
)

expression要获取第一个值的列或者表达式

partition by 用于指定分组的列

order by 用于指定排序的列

  • 示例

查询不同客户端,年龄最小的用户。

select id,client,age,first_value(age) over(partition by client order by age) as min_age from temp.user_info
where id <= 10
order by id;

数据结果

id client age min_age
1 ios 29 26
2 ios 26 26
3 android 35 35
4 ios 32 26
5 ios 33 26
6 ios 36 26
7 ios 29 26
8 ios 28 26
9 ios 32 26
10 ios 26 26

可以看到当前ios客户端的最小年龄为26,android客户端最小年龄为35.

  • 拓展使用

这样查有什么用呢?

例如可以进一步求解当前用户年龄和最小年龄或者最大年龄的差值。

如果是其他例如销售数据,或者活跃数据等,就更加有实用意义了。

总之,SQL窗口分析函数能够支持我们在更多的场景直接进行数据处理,进而更加深入和高效的进行数据分析

以上,关于SQL窗口函数的三类就更完了。后续更多以SQL每日一题的方式体现。

感谢阅读。

下一期:还没想好。

按例,欢迎点击此处关注我的个人公众号,交流更多知识。

与SQL窗口分析函数使用详解系列三之偏移量类窗口函数相似的内容:

SQL窗口分析函数使用详解系列三之偏移量类窗口函数

1.综述 本文以HiveSQL语法进行代码演示。 对于其他数据库来说同样也适用,比如SparkSQL,FlinkSQL以及Mysql8,Oracle,SqlServer等传统的关系型数据库。 已更新第一类聚合函数类,点击这里阅读 ①SQL窗口函数系列一之聚合函数类 ②SQL窗口函数系列二之分组排序窗

SQL KEEP 窗口函数等价改写案例

一哥们出条sql题给我玩,将下面sql改成不使用keep分析函数的写法。 select deptno, ename, sal, hiredate, min(sal) keep(dense_rank first order by hiredate) over(partition by deptno)

如何利用窗口函数实现精确排名计算?

前言 SQL语句中,聚合函数在统计业务数据结果时起到了重要作用,比如计算每个业务地区的业务总数、每个班级的学生平均分以及每个分类的最大值等。然而,今天小编将为大家介绍窗口函数,与聚合函数相比,它们也是一组函数,但在使用方法和适用场景上有所不同。在本章节中,我将重点介绍窗口函数中的RANK和DENSE

窗口函数实战指南:轻松掌握排名计算技巧,提升数据处理效率

> 摘要:本文由葡萄城技术团队于博客园原创并首发。转载请注明出处:[葡萄城官网](https://www.grapecity.com.cn/),葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 # 前言 SQL语句中,聚合函数在统计业务数据结果时起到了重要作用,比如计算每个业务地区的业

MySQL8新特性窗口函数详解

本文博主给大家详细讲解一波 MySQL8 的新特性:**窗口函数**,相信大伙看完一定能有所收获🤓。 - 本文提供的 sql 示例都是基于 MySQL8,由博主亲自执行确保可用 - 博主github地址:http://github.com/wayn111 ,欢迎大家关注,点个star # 简介 M

SQL查询语句汇总

SQL查询语句汇总 students表 idclass_idnamegenderscore 1 1 小明 M 90 2 1 小红 F 95 class表 idname 1 一班 2 二班 3 三班 4 四班 1.基本查询 -- 查询students表的所有数据 SELECT * FROM stude

【SQL】晨光咖啡馆,过滤聚合的微妙碰撞

这天,小悦懒洋洋地步入办公楼下的咖啡馆,意外地与一位男子不期而遇。他显然因前一晚的辛勤工作而略显疲惫,却仍选择早到此地,寻找一丝宁静与放松。他叫逸尘,身姿挺拔,衣着简约而不失格调,晨光下更显英俊不凡,吸引了周遭的目光。两人仿佛心有灵犀,不约而同地走向各自的位置。 小悦手中轻握着新出炉的拿铁,眼睛紧紧

SQL注入方法

目录前言如何测试与利用注入点手工注入思路工具sqlmap-r-u-m--level--risk-v-p--threads-batch-smart--os-shell--mobiletamper插件获取数据的相关参数 前言 记录一些注入思路和经常使用的工具,后续有用到新的工具和总结新的方法再继续补充。

性能分析: 快速定位SQL问题

在数据库性能调优的实践中,SQL性能分析是至关重要的一环。一个执行效率低下的SQL语句可能会导致整个系统的性能瓶颈。 为了快速定位并解决这些问题,我们需要对SQL进行性能分析。本文将介绍一些常用的方法和技术,帮助大家快速定位SQL问题。 1、找出执行时间最长的SQL 首先,我们需要找到执行时间最长的

大数据面试SQL每日一题系列:最高峰同时在线主播人数。字节,快手等大厂高频面试题

大数据面试SQL每日一题系列:最高峰同时在线主播人数。字节,快手等大厂高频面试题 之后会不定期更新每日一题sql系列。 SQL面试题每日一题系列内容均来自于网络以及实际使用情况收集,如有雷同,纯属巧合。 1.题目 问题1:如下为某直播平台各主播的开播及关播时间数据明细,现在需要计算该平台最高峰期同时