hive之lag函数

从博客上发现两个面试题,其中有个用到了lag函数。整理学习

LAG 函数是 Hive 中常用的窗口函数,用于访问同一分区内 前一行(或前 N 行)的数据。它在分析时间序列数据、计算相邻记录差异等场景中非常有用。

一、语法

LAG(column, offset, default) OVER (PARTITION BY partition_expression ORDER BY sort_expression [ASC|DESC]
)
  • column:需要访问的列。

  • offset:向前回溯的行数(默认为 1)。

  • default:当没有前 N 行时的默认值(默认为 NULL)。

  • PARTITION BY:按指定字段分区,每个分区独立计算。

  • ORDER BY:定义分区内的排序方式。

二、代码示例

1. 示例数据表 sales
sale_daterevenueuser_id
2023-01-011001
2023-01-021501
2023-01-032001
2023-01-01502
2023-01-02802
2. 创建表并插入数据
CREATE TABLE sales (sale_date STRING,revenue INT,user_id INT
);INSERT INTO sales VALUES
('2023-01-01', 100, 1),
('2023-01-02', 150, 1),
('2023-01-03', 200, 1),
('2023-01-01', 50, 2),
('2023-01-02', 80, 2);
3. 使用 LAG 计算每日环比增长
select user_id  --用户,sale_date  --销售日期,revenue  --收入,lag(revenue,1) over(partition by user_id order by sale_date ) as prev_revenue --前一天的收入,revenue - LAG(revenue, 1) OVER (PARTITION BY user_id ORDER BY sale_date) AS growth --每日环比增长from sales

三、使用场景

1、时间序列分析
  • 计算每日/月销售额的环比增长(如示例所示)。

  • 检测异常波动(如某天收入骤降 90%)。

 异常波动示例:假设有一张销售表 sales,需要检测 单用户单日销售额相比前一日波动超过 50% 的异常情况。

CREATE TABLE sales_yc (user_id INT,sale_date STRING,revenue DOUBLE
)
stored as orcINSERT INTO sales_yc VALUES
(1, '2023-01-01', 100.0),
(1, '2023-01-02', 150.0),  -- 正常增长 50%
(1, '2023-01-03', 30.0),   -- 异常下降 80%
(2, '2023-01-01', 200.0),
(2, '2023-01-02', 450.0);  -- 异常增长 125%with tmp as
(
select user_id,sale_date,revenue,lag(revenue,1,0) over(partition by user_id order by sale_date) prev_revenuefrom sales_yc
)
select user_id,sale_date,revenue,if(prev_revenue = 0,null,round((revenue - prev_revenue) / prev_revenue * 100,2))||'%' change_percentfrom tmp
where abs((revenue - prev_revenue) / prev_revenue) > 0.5and prev_revenue <> 0

user_idsale_daterevenueprev_revenuechange_percent
12023-01-0330.0150.0-80.0-- 下降 80%
22023-01-02450.0200.0125.0-- 增长 125%
2、填充缺失值

若数据缺失,可用前一行值填充: 

SELECT sale_date,COALESCE(revenue, LAG(revenue) OVER (ORDER BY sale_date)) AS imputed_revenue
FROM sales;
3、用户行为分析

计算用户两次操作的时间间隔:

CREATE TABLE user_events (user_id STRING,event_time STRING,event_type STRING
)
stored as orcINSERT overwrite table user_events VALUES
('u1', '2023-01-01 08:00:00', 'login'),
('u1', '2023-01-01 08:05:30', 'click'),
('u1', '2023-01-01 08:15:45', 'purchase'),
('u2', '2023-01-01 09:00:00', 'login'),
('u2', '2023-01-01 09:30:00', 'logout'),
('u1', '2023-01-15 08:15:45', 'Add shopp');with tmp as 
(
select user_id,event_time,event_type,LAG(event_time, 1) OVER (PARTITION BY user_id  ORDER BY event_time ) AS prev_event_time -- 获取前一次操作时间(按用户分区,时间排序)from user_events
)
select user_id,event_time,event_type,prev_event_time,ROUND((UNIX_TIMESTAMP(event_time) - UNIX_TIMESTAMP(prev_event_time)) / 60,2) prev_event_time -- 计算时间间隔(转换为分钟,保留2位小数)from tmp;
4.库存管理

跟踪库存变化时,对比当前库存与前一日的差异。

CREATE TABLE stock (product_id STRING,stock_date STRING,  -- 日期格式需为 yyyy-MM-ddquantity INT
)
stored as orcINSERT INTO stock VALUES
('1', '2023-01-01', 100),
('1', '2023-01-02', 80),
('1', '2023-01-03', 120),
('2', '2023-01-01', 200),
('2', '2023-01-03', 180);SELECT product_id,stock_date,quantity,-- 获取前一日库存(按商品分区,按日期排序)LAG(quantity, 1) OVER (PARTITION BY product_id ORDER BY stock_date) AS prev_quantity,-- 计算差异(当前库存 - 前一日库存)quantity - LAG(quantity, 1) OVER (PARTITION BY product_id ORDER BY stock_date) AS diff
FROM stock;--筛选出库/入库记录
SELECT *
FROM (-- 上述计算差异的 SQL
) tmp
WHERE diff IS NOT NULL;

四、面试题

已知有数据A如下,请分别根据A生成B和C。

数据A

+-----+-------+
| id  | name  |
+-----+-------+
| 1   | aa    |
| 2   | aa    |
| 3   | aa    |
| 4   | d     |
| 5   | c     |
| 6   | aa    |
| 7   | aa    |
| 8   | e     |
| 9   | f     |
| 10  | g     |
+-----+-------+

数据B 

+-----+-----------------+
| id  |      name       |
+-----+-----------------+
| 7   | aa|aa|aa|aa|aa  |
| 4   | d               |
| 5   | c               |
| 8   | e               |
| 9   | f               |
| 10  | g               |
+-----+-----------------+
+-----+-----------+
| id  |   name    |
+-----+-----------+
| 3   | aa|aa|aa  |
| 4   | d         |
| 5   | c         |
| 7   | aa|aa     |
| 8   | e         |
| 9   | f         |
| 10  | g         |
+-----+-----------+

1、题目一 要求对name相同的数据进行合并处理,name相同的合并到一起用’|'进行拼接,id取组内最大值

2、题目二 要求对相邻name相同的数据进行合并,name相同的合并到一起用’|'进行拼接,id取组内最大值

问题1实现逻辑:

with tmp as (
select id,name,max(id) over(partition by name) new_idfrom data_a
)
select new_id,concat_ws('|',collect_list(name))from tmp 
group by new_id
order by new_id

问题2实现逻辑:

selectmax(id) as id,concat_ws("|",collect_list(name)) as name 
from(selectid,name,sum(is_continus) over(order by id) as continus_gpfrom(selectid,name,if(name=lag(name) over( order by id),0,1) as is_continusfromdata_a)tmp
) a
group bycontinus_gp  

:sql面试题目来源 SQL面试题——京东SQL面试题 合并数据-CSDN博客

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【软考-架构】1.3、磁盘-输入输出技术-总线

GitHub地址&#xff1a;https://github.com/tyronczt/system_architect ✨资料&文章更新✨ 文章目录 存储系统&#x1f4af;考试真题输入输出技术&#x1f4af;考试真题第一题第二题 存储系统 寻道时间是指磁头移动到磁道所需的时间&#xff1b; 等待时间为等待读写的扇区…

盛铂科技PDROUxxxx系列锁相介质振荡器(点频源):高精度信号源

——超低相位噪声、宽频覆盖、灵活集成&#xff0c;赋能下一代射频系统 核心价值&#xff1a;以突破性技术解决行业痛点 在雷达、卫星通信、高速数据采集等高端射频系统中&#xff0c;信号源的相位噪声、频率稳定度及集成灵活性直接决定系统性能上限。盛铂科技PDROUxxxx系列锁…

【安装】SQL Server 2005 安装及安装包

安装包 SQLEXPR.EXE&#xff1a;SQL Server 服务SQLServer2005_SSMSEE.msi&#xff1a;数据库管理工具&#xff0c;可以创建数据库&#xff0c;执行脚本等。SQLServer2005_SSMSEE_x64.msi&#xff1a;同上。这个是 64 位操作系统。 下载地址 https://www.microsoft.com/zh-c…

【文献阅读】The Efficiency Spectrum of Large Language Models: An Algorithmic Survey

这篇文章发表于2024年4月 摘要 大语言模型&#xff08;LLMs&#xff09;的快速发展推动了多个领域的变革&#xff0c;重塑了通用人工智能的格局。然而&#xff0c;这些模型不断增长的计算和内存需求带来了巨大挑战&#xff0c;阻碍了学术研究和实际应用。为解决这些问题&…

如何在Github上面上传本地文件夹

前言 直接在GitHub网址上面上传文件夹是不行的&#xff0c;需要一层一层创建然后上传&#xff0c;而且文件的大小也有限制&#xff0c;使用Git进行上传更加方便和实用 1.下载和安装Git Git - Downloads 傻瓜式安装即可 2.获取密钥对 打开自己的Github&#xff0c;创建SSH密钥&…

kafka-web管理工具cmak

一. 背景&#xff1a; 日常运维工作中&#xff0c;采用cli的方式进行kafka集群的管理&#xff0c;还是比较繁琐的(指令复杂&#xff1f;)。为方便管理&#xff0c;可以选择一些开源的webui工具。 推荐使用cmak。 二. 关于cmak&#xff1a; cmak是 Yahoo 贡献的一款强大的 Apac…

python之爬虫入门实例

链家二手房数据抓取与Excel存储 目录 开发环境准备爬虫流程分析核心代码实现关键命令详解进阶优化方案注意事项与扩展 一、开发环境准备 1.1 必要组件安装 # 安装核心库 pip install requests beautifulsoup4 openpyxl pandas# 各库作用说明&#xff1a; - requests&#x…

Redis的CPU高达90%时如何处理

Redis的CPU高达90%时如何处理 1. 分析和优化2. 扩展和分片3. 缓存策略调整4. 资源提升5. 负载均衡6. 进程调整7. 代码层面改进8. 其他 当Redis的CPU使用率高达90%时&#xff0c;说明Redis服务器可能处于过载状态&#xff0c;这可能会导致响应时间变长甚至服务中断。要处理这种…

Faster R-CNN 算法详解

Faster R-CNN 是在 R-CNN 和 Fast R-CNN 的基础上进一步优化的一种目标检测算法。它通过引入 Region Proposal Network (RPN) 将区域建议和目标检测整合到一个统一的框架中,大幅提高了检测效率。以下是对 Faster R-CNN 算法的详细解析: 1. 概述 Faster R-CNN 主要由三部分组…

数据结构:八大排序(冒泡,堆,插入,选择,希尔,快排,归并,计数)详解

目录 一.冒泡排序 二.堆排序 三.插入排序 四.选择排序 五.希尔排序 六.快速排序 1.Lomuto版本&#xff08;前后指针法&#xff09; 2.Lomuto版本的非递归算法 3.hoare版本&#xff08;左右指针法&#xff09; 4.挖坑法找分界值&#xff1a; 七.归并排序 八.计数排序…

【商城实战(2)】商城架构设计:从底层逻辑到技术实现

【商城实战】专栏重磅来袭&#xff01;这是一份专为开发者与电商从业者打造的超详细指南。从项目基础搭建&#xff0c;运用 uniapp、Element Plus、SpringBoot 搭建商城框架&#xff0c;到用户、商品、订单等核心模块开发&#xff0c;再到性能优化、安全加固、多端适配&#xf…

Mac mini M4安装nvm 和node

先要安装Homebrew&#xff08;如果尚未安装&#xff09;。在终端中输入以下命令&#xff1a; /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)" 根据提示操作完成Homebrew的安装。 安装nvm。在终端中输入以下命令&#xf…

FOC无感开环启动算法

FOC无感开环启动排除掉高频注入这种直接识别当前转子dq轴的位置直接闭环启动&#xff0c;大部分的常规启动方式就是三段式启动&#xff0c;对齐-强拖-观测器介入-观测器误差稳定后平滑过渡-闭环。 这里就只写出I/F&#xff08;V/F&#xff09;启动的角度输出的代码&#xff0c…

Android 自定义View 加 lifecycle 简单使用

前言 本文是自定义view中最简单的使用方法&#xff0c;分别进行 ‘onMeasure’、‘onDraw’、‘自定义样式’、‘lifecycle’的简单使用&#xff0c;了解自定义view的使用。 通过lifecycle来控制 动画的状态 一、onMeasure做了什么&#xff1f; 在onMeasure中获取view 的宽和…

《挑战你的控制力!开源小游戏“保持平衡”开发解析:用HTML+JS+CSS实现物理平衡挑战》​

&#x1f4cc; 大家好&#xff0c;我是智界工具库&#xff0c;致力于分享好用实用且智能的软件以及在JAVA语言开发中遇到的问题&#xff0c;如果本篇文章对你有所帮助请帮我点个小赞小收藏吧&#xff0c;谢谢喲&#xff01;&#x1f618;&#x1f618;&#x1f618; 博主声…

浅浅初识AI、AI大模型、AGI

前记&#xff1a;这里只是简单了解&#xff0c;后面有时间会专门来扩展和深入。 当前&#xff0c;人工智能&#xff08;AI&#xff09;及其细分领域&#xff08;如AI算法工程师、自然语言处理NLP、通用人工智能AGI&#xff09;的就业前景呈现高速增长态势&#xff0c;市场需求…

服务器时间同步

方法一 [rootbogon hwh-ansible]# cat time-sync.sh #!/bin/bash # NTP 服务器信息 NTP_SERVER"192.168.42.12" PASSWORD"123456" # 多个 IP 地址 HOSTS("192.168.42.8" "192.168.42.9" "192.168.42.10" "192.168.42…

Android Studio安装与配置详解

Android Studio安装与配置详解 前言 作为一名Android开发者&#xff0c;Android Studio是我们日常开发中最重要的工具。本文将详细介绍Android Studio的安装配置过程&#xff0c;帮助你搭建一个高效的开发环境。 一、Android Studio下载与安装 1.1 下载Android Studio 访问…

在PyCharm开发环境中,如何建立hello.py文件?

李升伟 整理 一、分析 首先&#xff0c;用户可能是刚接触PyCharm或者Python的新手&#xff0c;所以需要从打开软件开始讲起。不过用户可能已经安装好了PyCharm&#xff0c;但也许需要确认是否已经正确安装。不过问题重点在创建文件&#xff0c;可能不需要深入安装步骤。 接下…

es6常见知识点

官方文档&#xff1a;[https://es6.ruanyifeng.com/](https://es6.ruanyifeng.com/) 一、Class 1、Class Class只是一个语法糖,其功能用es5也能实现,但是比es5更符合类的期待 定义: constructor代表构造方法,而this指向new 生成的实例 定义类方法时,可以不使用function 注…