Khám phá hàm Lag và Lead trong SQL

Khám phá hàm Lag và Lead trong SQL

Trong phân tích dữ liệu, hàm LAG() LEAD() sẽ công cụ hỗ trợ đắc lực cho việc so sánh giá trị hiện tại với giá trị liền trước hoặc liền sau điều thường xuyên xảy ra từ theo dõi xu hướng doanh thu, hành vi người dùng, đến hiệu suất hệ thống. đơn giản, hai hàm này giúp bạn dễ dàng truy xuất dữ liệu từ dòng trước hoặc sau trong bảng, không cần viết truy vấn phức tạp hay sử dụng nhiều phép JOIN. Đây công cụ cực kỳ hữu ích để xử dữ liệu tính thứ tự.

UniTrain sẽ giúp bạn hiểu cách dùng qua dụ thực tế ứng dụng trong công việc. 

HÀM LAG 

Hàm LAG() cho phép lấy giá trị từ dòng trước đó trong kết quả truy vấn. Tên gọi của hàm cũng thể hiện rõ chức năng của nó – “lùi lại phía sau”. 

Cú pháp: 

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

[PARTITION BY partition_expression, …]

ORDER BY sort_expression [ASC | DESC], …)

  • expression: Là cột hoặc giá trị bạn muốn lấy. 
  • offset: Tham số tùy chọn, chỉ định số dòng phía sau dòng hiện tại mà bạn muốn xem. Nếu không ghi rõ, mặc định là 1. 
  • default: Tham số tùy chọn, giá trị trả về khi hàm LAG() cố gắng truy cập vượt ra ngoài dòng đầu tiên. Nếu không chỉ định, giá trị mặc định là NULL. 
  • PARTITION BY: Chia tập kết quả thành các phần (phân vùng), và hàm LAG() chỉ hoạt động trong mỗi phân vùng riêng biệt. 
  • ORDER BY: Xác định thứ tự của các dòng trong tập kết quả hoặc từng phân vùng. 

Giống như các hàm khác, LAG() yêu cầu phải có mệnh đề OVER. Mệnh đề này có thể nhận các tham số tùy chọn, sẽ được giải thích sau. Với LAG(), bạn bắt buộc phải chỉ định ORDER BY trong mệnh đề OVER, với một cột hoặc danh sách các cột để xác định thứ tự sắp xếp các dòng. 

Ví dụ chúng ta có một bảng chi tiết đơn hàng (SalesOrderDetail) thể hiện doanh thu của từng dòng đơn hàng:
Chi tiết đơn hàng và doanh thu của từng đơnMục tiêu của chúng ta phân tích sự biến động doanh thu giữa các dòng đơn hàng liền kề. Cụ thể, chúng ta muốn tính xem xét, so sánh doanh thu qua các đơn hàng:

SELECT
SalesOrderDetailID,
LineTotal,
LAG(LineTotal)
OVER (ORDER BY SalesOrderDetailID) AS PrevLineTotal
FROM
SalesLT.SalesOrderDetail;

Kết quả

So sánh doanh thu của từng đơn hàng

HÀM LEAD 

Hàm LEAD() là sẽ ngược lại với hàm LAG(). Nó cho phép bạn lấy giá trị từ dòng tiếp theo trong tập kết quả — tức là nhìn trước một hoặc nhiều dòng trong dữ liệu. 

Cú pháp hàm LEAD:

LEAD(expression [, offset [, default]])
OVER (
[PARTITION BY partition_expression, … ] ORDER BY sort_expression [ASC | DESC], …)
  • expression: Cột hoặc biểu thức bạn muốn lấy từ dòng tiếp theo. 
  • offset (tuỳ chọn): Số dòng muốn nhìn tới (mặc định là 1 dòng kế tiếp). 
  • default (tuỳ chọn): Giá trị trả về nếu dòng kế tiếp không tồn tại. 
  • OVER(…): Bắt buộc, xác định cách sắp xếp và (nếu cần) phân vùng dữ liệu. 

Tương tự với bảng dữ liệu trên:  

Chi tiết đơn hàng và doanh thu của từng đơn

Muốn xác định tổng doanh thu (LineTotal) của dòng đơn hàng kế tiếp, so với từng dòng hiện tại. Cụ thể, bạn đang truy xuất thông tin “tương lai gần” trong tập dữ liệu – tức giá trị kế tiếp theo thứ tự SalesOrderDetailID. 

SELECT
SalesOrderDetailID,
LineTotal,
LEAD(LineTotal) OVER (ORDER BY SalesOrderDetailID) AS NextLineTotal
FROM
SalesLT.SalesOrderDetail;

Kết quả truy vấn:

So sánh doanh thu với Lead

Kết luận 

Hàm LAG() và LEAD() là hai công cụ rất hữu ích trong phân tích dữ liệu, giúp truy xuất nhanh chóng giá trị của dòng liền trước hoặc liền sau mà không cần viết các truy vấn phức tạp hay dùng nhiều phép JOIN. Chúng đặc biệt hiệu quả khi làm việc với dữ liệu có tính thứ tự hoặc dữ liệu phân vùng, cho phép bạn dễ dàng so sánh, phân tích xu hướng, biến động hay dự báo dựa trên các giá trị liền kề trong bảng.

Việc sử dụng linh hoạt hàm LAG() và LEAD() sẽ giúp tối ưu quá trình xử lý dữ liệu, tiết kiệm thời gian và tăng tính chính xác trong phân tích, từ đó hỗ trợ đưa ra quyết định nhanh chóng và hiệu quả trong công việc. 

Theo dõi Fanpage UniTrain để khám phá thêm nhiều thông tin hữu ích nhé.

Xem thêm

Ứng dụng SQL trong xử lý dữ liệu

Phân biệt WHERE và HAVING trong SQL

SQL và các hàm xử lý kiểu dữ liệu Date thông dụng

Bài viết liên quan
Hàm TRIMRANGE() – Hàm xóa giá trị trống “đỉnh” hơn cả TRIM.

Như bạn đã biết hàm TRIM() trong Excel giúp loại bỏ các ký tự trống (khoảng trắng). Tương tự vậy hàm TRIMRANGE() được sử dụng để xóa các giá trị trống khỏi một phạm vi

Xem thêm
[HOẠT ĐỘNG CỘNG ĐỒNG] Cuộc thi Financial Student Contest (FSC) mùa 13 – CLB Tài chính – Chứng khoán (SeSC) – Đại học Ngoại Thương CSII TP. HCM (FTU2)

Chiều tối ngày 13/06/2025, Chung kết cuộc thi Financial Student Contest (FSC) mùa 13 do CLB Tài chính – Chứng khoán (SeSC) thuộc Đại học Ngoại Thương CSII TP. HCM (FTU2)

Xem thêm
[HOẠT ĐỘNG CỘNG ĐỒNG] Cuộc thi myInsight – MDS Datathon Challenge 2025 – CLB Toán ứng dụng & Khoa học dữ liệu (MDS) – CSII Đại học Ngoại Thương TP. HCM (FTU2)

Chiều ngày 08/06/2025 vừa qua, cuộc thi myInsight – MDS Datarthon Challenge 2025 đã chính thức tiến đến vòng chung kết dưới sự góp mặt của top 5 đội thi xuất

Xem thêm
Cảm nhận học viên khóa Excel for Analysts

“Mình rất hài lòng về tính ứng dụng thực tế và khả năng nâng cao hiệu quả công việc của khóa học.” Anh Nguyễn Trung Hòa – nhân sự ngành Kế

Xem thêm