HIVE_HIVE函数_窗口函数_LAG()/LEAD() 详解

2024-05-03 05:48
文章标签 函数 详解 窗口 hive lag lead

本文主要是介绍HIVE_HIVE函数_窗口函数_LAG()/LEAD() 详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 

参考文章:

1.ORALCE函数:LAG()和LEAD() 分析函数详解、

https://blog.csdn.net/pelifymeng2/article/details/70313943

 

 

LAG, LEAD 函数简单介绍

 Lag和Lead分析函数可以在同一次查询中取出同一字段的前N行的数据(Lag)和后N行的数据(Lead)作为独立的列。

  在实际应用当中,若要用到取今天和昨天的某字段差值时,Lag和Lead函数的应用就显得尤为重要。当然,这种操作可以用表的自连接实现,但是 LAG 和 LEAD 与 left join、right join 等自连接相比,效率更高,SQL更简洁。下面我就对这两个函数做一个简单的介绍。 
 

 

函数语法

lag(exp_str,offset,defval) over(partion by ..order by …)

lead(exp_str,offset,defval) over(partion by ..order by …)

其中exp_str是字段名

     Offset是偏移量,即是上1个或上N个的值,假设当前行在表中排在第5行,则offset 为3,则表示我们所要找的数据行就是表中的第2行(即5-3=2)。

     Defval默认值,当两个函数取上N/下N个值,当在表中从当前行位置向前数N行已经超出了表的范围时,lag()函数将defval这个参数值作为函数的返回值,若没有指定默认值,则返回NULL,那么在数学运算中,总要给一个默认值才不会出错。
 

例子 

构建表,插入测试数据

use data_warehouse_test;CREATE TABLE IF NOT EXISTS user_old_salary_info (user_name STRING,salary_vaild_date STRING,salary BIGINT
)
;INSERT OVERWRITE TABLE user_old_salary_info VALUES
('szh', '2011-11-06', 1000)
,('sx', '2011-11-07', 2000)
,('szh', '2015-06-11', 4000)
,('sx', '2016-07-12', 5000)
,('szh', '2017-08-20', 10000)
,('sg', '2017-08-20', 30000)
,('szh', '2020-06-20', 25000)
;

进行相关查询

use data_warehouse_test;SELECT * 
FROM user_old_salary_info
;SELECT user_name, salary, LAG(salary, 1, 0) OVER(PARTITION BY user_name ORDER BY salary_vaild_date) AS last_salary
FROM user_old_salary_info
;SELECT user_name, salary, LEAD(salary, 1, 0) OVER() AS next_salary
FROM user_old_salary_info
;

 

 

查询表中所有的记录:

SELECT * 
FROM user_old_salary_info
;

+---------------------------------+-----------------------------------------+------------------------------+
| user_old_salary_info.user_name  | user_old_salary_info.salary_vaild_date  | user_old_salary_info.salary  |
+---------------------------------+-----------------------------------------+------------------------------+
| szh                             | 2011-11-06                              | 1000                         |
| sx                              | 2011-11-07                              | 2000                         |
| szh                             | 2015-06-11                              | 4000                         |
| sx                              | 2016-07-12                              | 5000                         |
| szh                             | 2017-08-20                              | 10000                        |
| sg                              | 2017-08-20                              | 30000                        |
| szh                             | 2020-06-20                              | 25000                        |
+---------------------------------+-----------------------------------------+------------------------------+

 

=============================

 

某一个员工 本次的薪水 和 上一次的薪水

SELECT user_name, salary, LAG(salary, 1, 0) OVER(PARTITION BY user_name ORDER BY salary_vaild_date) AS last_salary
FROM user_old_salary_info
;

 

+------------+---------+--------------+
| user_name  | salary  | last_salary  |
+------------+---------+--------------+
| sg         | 30000   | 0            |
| sx         | 2000    | 0            |
| sx         | 5000    | 2000         |
| szh        | 1000    | 0            |
| szh        | 4000    | 1000         |
| szh        | 10000   | 4000         |
| szh        | 25000   | 10000        |
+------------+---------+--------------+

 

=============================

 

顺序查看 本次的薪水 和 上一次的薪水

SELECT user_name, salary, LEAD(salary, 1, 0) OVER() AS next_salary
FROM user_old_salary_info
;

 

+------------+---------+--------------+
| user_name  | salary  | next_salary  |
+------------+---------+--------------+
| szh        | 25000   | 30000        |
| sg         | 30000   | 10000        |
| szh        | 10000   | 5000         |
| sx         | 5000    | 4000         |
| szh        | 4000    | 2000         |
| sx         | 2000    | 1000         |
| szh        | 1000    | 0            |
+------------+---------+--------------+

 

这篇关于HIVE_HIVE函数_窗口函数_LAG()/LEAD() 详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/955957

相关文章

Python中的魔术方法__new__详解

《Python中的魔术方法__new__详解》:本文主要介绍Python中的魔术方法__new__的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、核心意义与机制1.1 构造过程原理1.2 与 __init__ 对比二、核心功能解析2.1 核心能力2.2

在PyCharm中安装PyTorch、torchvision和OpenCV详解

《在PyCharm中安装PyTorch、torchvision和OpenCV详解》:本文主要介绍在PyCharm中安装PyTorch、torchvision和OpenCV方式,具有很好的参考价值,... 目录PyCharm安装PyTorch、torchvision和OpenCV安装python安装PyTor

SpringBoot条件注解核心作用与使用场景详解

《SpringBoot条件注解核心作用与使用场景详解》SpringBoot的条件注解为开发者提供了强大的动态配置能力,理解其原理和适用场景是构建灵活、可扩展应用的关键,本文将系统梳理所有常用的条件注... 目录引言一、条件注解的核心机制二、SpringBoot内置条件注解详解1、@ConditionalOn

MySQL高级查询之JOIN、子查询、窗口函数实际案例

《MySQL高级查询之JOIN、子查询、窗口函数实际案例》:本文主要介绍MySQL高级查询之JOIN、子查询、窗口函数实际案例的相关资料,JOIN用于多表关联查询,子查询用于数据筛选和过滤,窗口函... 目录前言1. JOIN(连接查询)1.1 内连接(INNER JOIN)1.2 左连接(LEFT JOI

Qt spdlog日志模块的使用详解

《Qtspdlog日志模块的使用详解》在Qt应用程序开发中,良好的日志系统至关重要,本文将介绍如何使用spdlog1.5.0创建满足以下要求的日志系统,感兴趣的朋友一起看看吧... 目录版本摘要例子logmanager.cpp文件main.cpp文件版本spdlog版本:1.5.0采用1.5.0版本主要

Linux ls命令操作详解

《Linuxls命令操作详解》通过ls命令,我们可以查看指定目录下的文件和子目录,并结合不同的选项获取详细的文件信息,如权限、大小、修改时间等,:本文主要介绍Linuxls命令详解,需要的朋友可... 目录1. 命令简介2. 命令的基本语法和用法2.1 语法格式2.2 使用示例2.2.1 列出当前目录下的文

MySQL中FIND_IN_SET函数与INSTR函数用法解析

《MySQL中FIND_IN_SET函数与INSTR函数用法解析》:本文主要介绍MySQL中FIND_IN_SET函数与INSTR函数用法解析,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一... 目录一、功能定义与语法1、FIND_IN_SET函数2、INSTR函数二、本质区别对比三、实际场景案例分

MySQL中的交叉连接、自然连接和内连接查询详解

《MySQL中的交叉连接、自然连接和内连接查询详解》:本文主要介绍MySQL中的交叉连接、自然连接和内连接查询,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、引入二、交php叉连接(cross join)三、自然连接(naturalandroid join)四

Go 语言中的select语句详解及工作原理

《Go语言中的select语句详解及工作原理》在Go语言中,select语句是用于处理多个通道(channel)操作的一种控制结构,它类似于switch语句,本文给大家介绍Go语言中的select语... 目录Go 语言中的 select 是做什么的基本功能语法工作原理示例示例 1:监听多个通道示例 2:带

mysql的基础语句和外键查询及其语句详解(推荐)

《mysql的基础语句和外键查询及其语句详解(推荐)》:本文主要介绍mysql的基础语句和外键查询及其语句详解(推荐),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋... 目录一、mysql 基础语句1. 数据库操作 创建数据库2. 表操作 创建表3. CRUD 操作二、外键