×

Truy vấn giá trị thứ N với NTH_VALUE trong MySQL

Khi làm việc với một bộ dữ liệu lớn trong MySQL, có rất nhiều trường hợp bạn cần truy xuất ra giá trị thứ N trong một tập hợp con của dữ liệu. Đây là lúc mà hàm NTH_VALUE – một phần của các hàm phân tích trong MySQL – trở nên cực kỳ hữu ích.

NTH_VALUE Là Gì?

NTH_VALUE là một hàm cửa sổ trong MySQL, được sử dụng để trả về giá trị thứ N trong một tập hợp con của dữ liệu. Cụ thể, tập hợp con này được xác định bởi mệnh đề OVER, trong đó bao gồm các mệnh đề như PARTITION BYORDER BY để chia nhóm và sắp xếp dữ liệu tương ứng.

Cú Pháp

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

NTH_VALUE (expression, N) OVER (
  [PARTITION BY expression_list]
  [ORDER BY expression_list
  [frame_clause])
  • expression: Cột dữ liệu mà bạn muốn truy xuất.
  • N: Số thứ tự của giá trị bạn cần lấy trong phân vùng.
  • PARTITION BY: Chia dữ liệu thành các nhóm nhỏ.
  • ORDER BY: Xác định thứ tự sắp xếp trong mỗi nhóm.
  • frame_clause: Xác định phạm vi của cửa sổ (window frame).

Ví Dụ Minh Họa

Giả sử bạn có một bảng sales lưu trữ thông tin về doanh thu bán hàng với cấu trúc sau:

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

Trong bảng này, mỗi hàng chứa thông tin về một lần bán hàng. Bạn muốn truy xuất giá trị bán hàng thứ 3 của mỗi nhân viên bán hàng (salesperson_id).

SELECT
    salesperson_id,
    sale_date,
    amount,
    NTH_VALUE(amount, 3) OVER (
        PARTITION BY salesperson_id
        ORDER BY sale_date
    ) AS third_highest_sale
FROM
    sales;

Trong truy vấn này:

  • Mệnh đề PARTITION BY chia dữ liệu theo từng salesperson_id.
  • Mệnh đề ORDER BY sắp xếp dữ liệu theo sale_date trong mỗi phân vùng.
  • Hàm NTH_VALUE(amount, 3) lấy giá trị bán hàng thứ 3 trong mỗi phân vùng.

Khung (Window Frame)

Khung thời gian (frame_clause) là một phần quan trọng trong hàm cửa sổ. Nếu không chỉ rõ khung thời gian, MySQL sẽ mặc định sử dụng RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW. Bạn có thể tùy chỉnh theo yêu cầu riêng của bạn, ví dụ:

NTH_VALUE(amount, 3) OVER (
    PARTITION BY salesperson_id
    ORDER BY sale_date
    ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
) AS third_highest_sale

Lưu Ý Sử Dụng

  1. Hiệu Suất: Hàm cửa sổ, bao gồm NTH_VALUE, có thể làm chậm hiệu suất khi xử lý dữ liệu lớn.
  2. NULL Values: Nếu không có đủ N giá trị trong phân vùng, kết quả trả về sẽ là NULL.

Kết Luận

Hàm NTH_VALUE là một công cụ mạnh mẽ hỗ trợ trong việc truy vấn giá trị theo thứ tự từ tập hợp dữ liệu trong MySQL. Bằng cách xác định phân vùng và sắp xếp dữ liệu, bạn có thể linh hoạt phân tích và thu thập được các giá trị cần thiết một cách hiệu quả.

Comments