1. 程式人生 > 其它 >分析函式之Lead()、Lag()

分析函式之Lead()、Lag()

目錄

一、功能介紹

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 
  • 解題說明
  1. 先取當前行,與下一行組成新的臨時表,讓其根據日期升序排列,最後填充今日的日期
  2. 求出日期差值,分組取出每個使用者的最大日期差值
作者:落花桂     出處:https://www.cnblogs.com/nthforsth/     本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連線,否則保留追究法律責任的權利。