分析函式之Lead()、Lag()
阿新 • • 發佈:2021-12-02
目錄
一、功能介紹
Lag 分析函式可以在同一次查詢中取出同一欄位的前N行的資料作為獨立的列。
Lead 分析函式可以在同一次查詢中取出同一欄位的後N行的資料作為獨立的列。
二、Lead(),Lag()函式語法
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
三、Lead()用法案例
- 資料來源
UserVisits 表: +---------+------------+ | user_id | visit_date | +---------+------------+ | 1 | 2020-11-28 | | 1 | 2020-10-20 | | 1 | 2020-12-3 | | 2 | 2020-10-5 | | 2 | 2020-12-9 | | 3 | 2020-11-11 | +---------+------------+
- 需求
假設今天的日期是'2021-1-1'。
編寫 SQL 語句,對於每個user_id,求出每次訪問及其下一個訪問(若該次訪問是最後一次,則為今天)之間最大的空檔期天數window。
返回結果表,按使用者編號user_id排序。
查詢格式如下示例所示:
結果表: +---------+---------------+ | user_id | biggest_window| +---------+---------------+ | 1 | 39 | | 2 | 65 | | 3 | 51 | +---------+---------------+
- SQL
select user_id,max(datediff(ld,visit_date)) biggest_window from (
select user_id,visit_date,
lead(visit_date,1,'2021-01-01') over(partition by user_id order by visit_date asc) ld
from UserVisits
) t
group by user_id
order by user_id
- 解題說明
- 先取當前行,與下一行組成新的臨時表,讓其根據日期升序排列,最後填充今日的日期
- 求出日期差值,分組取出每個使用者的最大日期差值