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

2024-04-26 20:28

本文主要是介绍SQL窗口分析函数使用详解系列三之偏移量类窗口函数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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 '用户信息测试临时表' 

数据预览

idclientgenderconstellationagepvchat_num
1ios0处女座291743
2ios1双鱼座262632
3android1双鱼座3523239
4ios1水瓶座32573
5ios1射手座33676
6ios1双子座36815
7ios1狮子座29684
8ios1狮子座28193
9ios0射手座324792
10ios1白羊座2625536

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;

数据结果

idclientagelag_1_age
1ios2910
2ios2629
3android3510
4ios3226
5ios3332
6ios3633
7ios2936
8ios2829
9ios3228
10ios2632

可以看到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;

数据结果

idclientagelead_2_age
1ios2932
2ios2633
3android3510
4ios3236
5ios3329
6ios3628
7ios2932
8ios2826
9ios3210
10ios2610

如上,我把偏移量设置为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;

数据结果

idclientagemin_age
1ios2926
2ios2626
3android3535
4ios3226
5ios3326
6ios3626
7ios2926
8ios2826
9ios3226
10ios2626

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

  • 拓展使用

这样查有什么用呢?

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

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

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

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

感谢阅读。

下一期:还没想好。

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

这篇关于SQL窗口分析函数使用详解系列三之偏移量类窗口函数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/938577

相关文章

Spring Boot中的路径变量示例详解

《SpringBoot中的路径变量示例详解》SpringBoot中PathVariable通过@PathVariable注解实现URL参数与方法参数绑定,支持多参数接收、类型转换、可选参数、默认值及... 目录一. 基本用法与参数映射1.路径定义2.参数绑定&nhttp://www.chinasem.cnbs

C++中assign函数的使用

《C++中assign函数的使用》在C++标准模板库中,std::list等容器都提供了assign成员函数,它比操作符更灵活,支持多种初始化方式,下面就来介绍一下assign的用法,具有一定的参考价... 目录​1.assign的基本功能​​语法​2. 具体用法示例​​​(1) 填充n个相同值​​(2)

MySql基本查询之表的增删查改+聚合函数案例详解

《MySql基本查询之表的增删查改+聚合函数案例详解》本文详解SQL的CURD操作INSERT用于数据插入(单行/多行及冲突处理),SELECT实现数据检索(列选择、条件过滤、排序分页),UPDATE... 目录一、Create1.1 单行数据 + 全列插入1.2 多行数据 + 指定列插入1.3 插入否则更

Redis中Stream详解及应用小结

《Redis中Stream详解及应用小结》RedisStreams是Redis5.0引入的新功能,提供了一种类似于传统消息队列的机制,但具有更高的灵活性和可扩展性,本文给大家介绍Redis中Strea... 目录1. Redis Stream 概述2. Redis Stream 的基本操作2.1. XADD

MySQL深分页进行性能优化的常见方法

《MySQL深分页进行性能优化的常见方法》在Web应用中,分页查询是数据库操作中的常见需求,然而,在面对大型数据集时,深分页(deeppagination)却成为了性能优化的一个挑战,在本文中,我们将... 目录引言:深分页,真的只是“翻页慢”那么简单吗?一、背景介绍二、深分页的性能问题三、业务场景分析四、

MySQL 迁移至 Doris 最佳实践方案(最新整理)

《MySQL迁移至Doris最佳实践方案(最新整理)》本文将深入剖析三种经过实践验证的MySQL迁移至Doris的最佳方案,涵盖全量迁移、增量同步、混合迁移以及基于CDC(ChangeData... 目录一、China编程JDBC Catalog 联邦查询方案(适合跨库实时查询)1. 方案概述2. 环境要求3.

Spring StateMachine实现状态机使用示例详解

《SpringStateMachine实现状态机使用示例详解》本文介绍SpringStateMachine实现状态机的步骤,包括依赖导入、枚举定义、状态转移规则配置、上下文管理及服务调用示例,重点解... 目录什么是状态机使用示例什么是状态机状态机是计算机科学中的​​核心建模工具​​,用于描述对象在其生命

Java JDK1.8 安装和环境配置教程详解

《JavaJDK1.8安装和环境配置教程详解》文章简要介绍了JDK1.8的安装流程,包括官网下载对应系统版本、安装时选择非系统盘路径、配置JAVA_HOME、CLASSPATH和Path环境变量,... 目录1.下载JDK2.安装JDK3.配置环境变量4.检验JDK官网下载地址:Java Downloads

PostgreSQL中rank()窗口函数实用指南与示例

《PostgreSQL中rank()窗口函数实用指南与示例》在数据分析和数据库管理中,经常需要对数据进行排名操作,PostgreSQL提供了强大的窗口函数rank(),可以方便地对结果集中的行进行排名... 目录一、rank()函数简介二、基础示例:部门内员工薪资排名示例数据排名查询三、高级应用示例1. 每

SQL server数据库如何下载和安装

《SQLserver数据库如何下载和安装》本文指导如何下载安装SQLServer2022评估版及SSMS工具,涵盖安装配置、连接字符串设置、C#连接数据库方法和安全注意事项,如混合验证、参数化查... 目录第一步:打开官网下载对应文件第二步:程序安装配置第三部:安装工具SQL Server Manageme