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.pswp.cn/diannao/72548.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/72548.shtml
英文地址,請注明出處:http://en.pswp.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 注…