×

Truy vấn giá trị cuối cùng với LAST_VALUE trong MySQL

Trong SQL, việc truy vấn để lấy giá trị cuối cùng trong một tập dữ liệu có thể là một thao tác phức tạp, đặc biệt khi chỉ định các điều kiện cụ thể hoặc khi làm việc với các bảng có cấu trúc phức tạp. MySQL cung cấp một số hàm phân tích mạnh mẽ để thực hiện các tác vụ này một cách hiệu quả, và trong số đó, hàm LAST_VALUE là một công cụ hữu ích đặc biệt khi cần lấy giá trị cuối cùng trong một nhóm các bản ghi.

Người dùng Quen dần với LAST_VALUE

Hàm LAST_VALUE là một hàm cửa sổ, nó cho phép bạn lấy giá trị trong hàng cuối cùng của một cửa sổ phân vùng được xác định bởi mệnh đề OVER. Điều này đặc biệt hữu ích khi bạn cần phân tích dữ liệu có thứ tự và muốn lấy thông tin từ hàng cuối cùng của từng phân nhóm.

Cơ bản về LAST_VALUE

Cú pháp cơ bản của LAST_VALUE trong MySQL như sau:

LAST_VALUE(expression) OVER (
  [PARTITION BY partition_expression]
  [ORDER BY sort_expression]
  [frame_clause])

Trong đó:

  • expression: Là biểu thức mà bạn muốn lấy giá trị cuối cùng.
  • PARTITION BY: Là mệnh đề tùy chọn dùng để phân chia các hàng thành các phân vùng.
  • ORDER BY: Là mệnh đề dùng để xác định thứ tự của các hàng trong từng phân vùng.
  • frame_clause: Xác định phạm vi của cửa sổ (ví dụ: từ hàng hiện tại đến hàng cuối cùng).

Ứng dụng thực tế

Giả sử bạn có một bảng sales chứa thông tin bán hàng với các cột sale_id, product_id, sale_date, và sale_amount. Bạn muốn tìm giá trị bán cuối cùng cho mỗi product_id.

Tạo bảng và chèn dữ liệu

Đầu tiên, hãy tạo bảng và chèn một số dữ liệu mẫu:

CREATE TABLE sales (
    sale_id INT AUTO_INCREMENT PRIMARY KEY,
    product_id INT,
    sale_date DATE,
    sale_amount DECIMAL(10, 2)
);

INSERT INTO sales (product_id, sale_date, sale_amount) VALUES
(1, '2023-01-01', 100.00),
(1, '2023-01-02', 200.00),
(2, '2023-01-01', 150.00),
(2, '2023-01-03', 300.00),
(3, '2023-01-01', 250.00);

Sử dụng LAST_VALUE

Để lấy giá trị bán cuối cùng cho mỗi sản phẩm, bạn có thể sử dụng hàm LAST_VALUE như sau:

SELECT
    product_id,
    sale_date,
    sale_amount,
    LAST_VALUE(sale_amount) OVER (
        PARTITION BY product_id
        ORDER BY sale_date
        ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
    ) AS last_sale_amount
FROM sales;

Kết quả sẽ hiển thị giá trị bán cuối cùng cho mỗi hàng dựa trên các phân vùng product_id.

Giải thích Windows Frame

Trong cú pháp trên, ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING có nghĩa là khung cửa sổ sẽ bao phủ tất cả các hàng trong phân vùng, từ hàng đầu tiên đến hàng cuối cùng. Điều này đảm bảo rằng hàm LAST_VALUE sẽ luôn lấy giá trị từ hàng cuối cùng của phân vùng, bất kể hàng hiện tại đang được xử lý là gì.

Ứng dụng mở rộng

Ngoài ví dụ trên, hàm LAST_VALUE còn có thể được sử dụng trong nhiều kịch bản khác như:

  • Theo dõi giá trị cổ phiếu cuối cùng trong ngày cho mỗi mã cổ phiếu.
  • Xác định khoảng thời gian hoạt động cuối cùng của người dùng trên một hệ thống.
  • Theo dõi trạng thái cuối cùng của một đối tượng sản phẩm trong một chu kỳ sản xuất.

Kết luận

Sử dụng hàm LAST_VALUE trong MySQL mang lại nhiều tiện ích khi làm việc với các tập dữ liệu có thứ tự. Khả năng lấy giá trị từ hàng cuối cùng trong một phân vùng giúp khai thác thông tin một cách hiệu quả và chính xác. Hy vọng bạn sẽ thấy công cụ này hữu ích trong các dự án phân tích dữ liệu và tối ưu hóa các truy vấn của mình.

Comments