×

Truy vấn giá trị trước đó với lệnh LAG trong MySQL

Trong quá trình phân tích dữ liệu và truy vấn cơ sở dữ liệu, việc so sánh giá trị hiện tại với giá trị trước đó là một tác vụ phổ biến để hiểu rõ hơn về xu hướng và biến động. Trong MySQL, bạn có thể sử dụng hàm LAG để truy vấn giá trị trước đó trong một tập hợp dữ liệu.

Hàm LAG là một hàm cửa sổ (window function), ra đời từ phiên bản MySQL 8.0 trở đi, giúp người dùng truy vấn và lấy giá trị từ một hàng cụ thể đứng trước (hoặc sau) hàng hiện tại trong tập hợp kết quả.

1. Cú pháp của hàm LAG

Cú pháp cơ bản của hàm LAG như sau:

LAG(expression, offset, default) OVER (
  [PARTITION BY partition_expression]
  ORDER BY sort_expression
)

Trong đó:

  • expression: Biểu thức hoặc cột mà bạn muốn lấy giá trị.
  • offset: Số lượng hàng trước hàng hiện tại mà bạn muốn truy vấn. Giá trị mặc định là 1.
  • default: Giá trị trả về nếu không có hàng nào trước hàng hiện tại (nếu không có, giá trị mặc định là NULL).
  • PARTITION BY partition_expression: Tùy chọn, chia tập hợp kết quả thành các nhóm nhỏ để áp dụng hàm LAG riêng biệt.
  • ORDER BY sort_expression: Xác định thứ tự hàng sử dụng để xác định giá trị trước đó.

2. Ví dụ minh họa

Hãy xem một ví dụ cụ thể để hiểu rõ hơn cách sử dụng hàm LAG trong MySQL.

Giả sử bạn có bảng doanh số bán hàng với cấu trúc và dữ liệu như sau:

CREATE TABLE sales (
  id INT AUTO_INCREMENT PRIMARY KEY,
  sale_date DATE,
  amount DECIMAL(10, 2)
);

INSERT INTO sales (sale_date, amount) VALUES
('2023-01-01', 100.00),
('2023-01-02', 150.00),
('2023-01-03', 120.00),
('2023-01-04', 130.00),
('2023-01-05', 160.00);

Bạn muốn lấy giá trị doanh thu của ngày trước đó để so sánh với doanh thu ngày hiện tại. Bạn có thể thực hiện truy vấn như sau:

SELECT
  sale_date,
  amount,
  LAG(amount, 1) OVER (ORDER BY sale_date) AS prev_day_amount
FROM sales;

Kết quả trả về sẽ trông như thế này:

sale_date amount prev_day_amount
2023-01-01 100.00 NULL
2023-01-02 150.00 100.00
2023-01-03 120.00 150.00
2023-01-04 130.00 120.00
2023-01-05 160.00 130.00

Giá trị prev_day_amount của ngày đầu tiên là NULL vì không có ngày nào trước đó.

3. PARTITION BY và các tùy chọn khác

Hàm LAG có thể được kết hợp với PARTITION BY để chia nhỏ dữ liệu theo một tiêu chí nào đó. Ví dụ, nếu bạn có dữ liệu doanh số bán hàng theo nhiều chi nhánh và muốn so sánh doanh thu của từng chi nhánh riêng lẻ, bạn có thể sử dụng PARTITION BY.

SELECT
  branch_id,
  sale_date,
  amount,
  LAG(amount, 1) OVER (PARTITION BY branch_id ORDER BY sale_date) AS prev_day_amount
FROM branch_sales;

Trong trường hợp này, dữ liệu được chia thành từng nhóm theo branch_id, và hàm LAG sẽ chỉ áp dụng trong từng nhóm riêng biệt.

4. Kết luận

Việc sử dụng hàm LAG trong MySQL giúp bạn dễ dàng truy vấn giá trị từ các hàng trước đó, từ đó cung cấp các thông tin hữu ích cho phân tích dữ liệu và báo cáo. Nó đặc biệt hữu dụng trong các tình huống cần phân tích biến động hoặc xu hướng thay đổi theo thời gian. Với cú pháp linh hoạt và các tùy chọn chia nhóm, hàm LAG trở thành công cụ mạnh mẽ và tiện dụng trong bộ công cụ phân tích dữ liệu của MySQL.

Comments