Hàm LAG và LEAD trong SQL

Hôm nay mình sẽ hướng dẫn các bạn sử dụng Hàm LAG và Hàm LEAD với ví dụ cụ thể để truy vấn dữ liệu theo dạng time-series ( dòng thời gian ).

Định nghĩa Hàm LAG và LEAD trong SQL server

Hàm LAG là 1 window function  cho phép bạn truy vấn một hoặc nhiều dòng trong 1 bảng mà không cần nối bảng với chính nó. Vì dụ như bạn đang chọn 1 hàng, hàm LAG sẽ trả về giá trị hàng trước nó trong bảng. Để trả về giá trị hàng tiếp theo trong bảng, chúng ta sử dụng hàm LEAD.

Hàm LAG và LEAD trong SQL
Học Lag and Lead trong SQL

Cú pháp:

Cú pháp của hàm LAG trong SQL server là: 

LAG ( expression [, offset [, default] ] )

OVER ( [ query_partition_clause ] order_by_clause )

Cú pháp của hàm LEAD trong SQL server là: 

LEAD  ( expression [, offset [, default] ] )

OVER ( [ query_partition_clause ] order_by_clause )

Chi tiết: 

expression

Một biểu thức có thể chứa các hàm lập sẵn ( sum, …) nhưng không được chứa bất kì hàm phân tích nào. 

Offset: 

Tùy chọn, Đây là phần lệch tính từ hàng hiện tại trong bảng, nếu tham số này bị bỏ qua, mặc định giá trị là 1.

default

Tùy chọn, Đây là giá trị được trả về nếu giá trị phần lệch chạy khỏi bảng. Nếu trường này để trống, giá trị mặc định sẽ là null.

order_by_clause:

Không bắt buộc. Nó được sử dụng để sắp xếp dữ liệu trong mỗi phân vùng.

query_partition_clause

Không bắt buộc. Nó được sử dụng để phân vùng kết quả thành các nhóm dựa trên một hoặc nhiều biểu thức.

order_by_clause: 

Không bắt buộc. Nó được sử dụng để sắp xếp dữ liệu trong mỗi phân vùng.

Ví dụ:

Cho một bảng chứa cách hoạt động của người dùng 1 app như sau:

date_key event_name customer_id
5/29/2021 view 7424
5/13/2021 view 7426
5/13/2021 view 7426
5/27/2021 search 7425
5/13/2021 register 7426
5/13/2021 add_to_cart 7425
5/13/2021 add_to_cart 7426
5/15/2021 view 7425
5/14/2021 search 7424
5/14/2021 purchase 7424
5/14/2021 purchase 7428
5/14/2021 register 7425
5/14/2021 add_to_cart 7428
5/14/2021 app_installed 7424

Và chúng ta chạy câu lệnh SQL sau:

1 2 3 SELECT customer_id, date_key, event_name, LAG (event_name,1) OVER (ORDER BY event_name) AS near_last_event_name FROM example1  GROUP BY customer_id

Nó sẽ trả về kết quả sau:

customer_id date_key event_name near_last_event_name
7428 5/14/2021 purchase null
7425 5/27/2021 search purchase
7424 5/29/2021 view search
7426 5/13/2021 view view

Trong ví dụ này, hàm LAG đã sắp xếp theo thứ tự thời gian tất cả các hoạt động trong bảng khách hàng và sau đó trả về hoạt động gần nhất kể từ sử dụng offset là 1.

Nếu sử dụng offset bằng 2 thay vào đó, nó sẽ trả lại hành động gần thứ 2 trước hành động cuối. 

Tương tự với hàm LEAD, Ta thử sử dụng Partitions cho bảng sau:

 Name   Team   Salary 
 Jae Crowder   Boston Celtics            6,796,117 
 Amir Johnson   Boston Celtics          12,000,000 
 Jared Sullinger   Boston Celtics            2,569,260 
 Isaiah Thomas   Boston Celtics            6,912,869 
 Bojan Bogdanovic   Brooklyn Nets            3,425,510 
 Markel Brown   Brooklyn Nets               845,059 
 Rondae Hollis-Jefferson   Brooklyn Nets            1,335,480 
 Brook Lopez   Brooklyn Nets          19,689,000 
 Al Horford   Atlanta Hawks          12,000,000 
 Kyle Korver   Atlanta Hawks            5,746,479 
 Dennis Schroder   Atlanta Hawks            1,763,400 
 Jeff Teague   Atlanta Hawks            8,000,000 

Mệnh đề truy vấn partition để trả lại mức lương cao nhất tiếp theo cho mỗi cầu  thủ nba trong team, Nhập câu lệnh SQL sau:

1 2 3 SELECT team, name, salary, LEAD (salary,1) OVER (PARTITION BY TEAM ORDER BY salary) AS next_highest_salary FROM salary

Nó sẽ trả về kết quả sau:

Team Name Salary next_highest_salary
Atlanta Hawks Dennis Schroder 1763400 5746479
Atlanta Hawks Kyle Korver 5746479 8000000
Atlanta Hawks Jeff Teague 8000000 12000000
Atlanta Hawks Al Horford 12000000 null
Boston Celtics Jared Sullinger 2569260 6796117
Boston Celtics Jae Crowder 6796117 6912869
Boston Celtics Isaiah Thomas 6912869 12000000
Boston Celtics Amir Johnson 12000000 null
Brooklyn Nets Markel Brown 845059 1335480
Brooklyn Nets Rondae Hollis-Jefferson 1335480 3425510
Brooklyn Nets Bojan Bogdanovic 3425510 19689000
Brooklyn Nets Brook Lopez 19689000 null

Kết

Như vậy là mình đã trình bày xong phần ứng dụng lead và lag vào phân tích dữ liệu, nếu các bạn thấy hữu ích hãy share bài này nhé.

Leave a Comment

Scroll to Top