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窗口函数系列二之分组排序窗

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

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

MySQL8新特性窗口函数详解

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

SQL调优

**1. 索引优化:** 确保适当的索引在数据库表上创建,以加快查询性能。分析查询语句,确定可能需要的列和联合索引,并避免过多或不必要的索引。 **2. 优化查询语句:** 优化查询语句的写法,避免**全表扫描**和不必要的数据检索。使用合适的WHERE子句、JOIN语句和子查询,以提高查询效率。

什么是SQL 语句中相关子查询与非相关子查询

要理解相关子查询和非相关子查询,我们得首先理解什么是子查询,子查询是指在一个查询语句中嵌套的另一个查询语句。

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

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

当 SQL Server(mssql-jdbc) 遇上 BigDecimal → 精度丢失,真坑!

开心一刻 中午和哥们一起喝茶 哥们说道:晚上喝酒去啊 我:不去,我女朋友过生日 哥们瞪大眼睛看着我:你有病吧,充气的过什么生日 我生气到:有特么生产日期的好吧 需求背景 系统对接了外部系统,调用外部系统的接口需要付费,一个接口一次调用付费 0.03 元 同一个月内,同一个接口最高付费 25 元 统计

以小博大外小内大,Db数据库SQL优化之小数据驱动大数据

SQL优化中,有一条放之四海而皆准的既定方针,那就是:永远以小数据驱动大数据。其本质其实就是以小的数据样本作为驱动查询能够优化查询效率,在SQL中,涉及到不同表数据的连接、转移、或者合并,这些操作必须得有个数据集作为“带头”大哥,即驱动数据,而这个驱动数据最好是数据量最小的那一个。 内大外小 在讨论

[转帖]SQL Server 聚集索引和 非聚集索引 说明

https://www.cndba.cn/dave/article/4506 索引是与表或视图关联的磁盘上结构,可以加快从表或视图中检索行的速度。 索引包含由表或视图中的一列或多列生成的键。 这些键存储在一个结构(B 树)中,使 SQL Server 可以快速有效地查找与键值关联的行。 1 聚集索引

[转帖]SQL Server 不同版本之间的 区别说明

2021-05-12 23:5062070原创SQLServer 本文链接:https://www.cndba.cn/dave/article/4527 SQL Server 数据库版本也是在不断的进行迭代。目前主流存在的版本有:SQL Server 2008、2012、2014、2016、2017