Nhóm hàm windown

Hàm LAG, LEAD, RANK, DENSE_RANK, ROW_NUMBERwindow functions (hàm cửa sổ) được MySQL hỗ trợ từ phiên bản 8.0 trở lên, giúp quan sát dữ liệu theo thứ tự mà không cần tự join chính nó.

🎯 1️⃣. Mục đích trong quản trị hệ thống CSDL

Các hàm này cho phép DBA hoặc Data Engineer:

  • So sánh giá trị giữa các bản ghi liền kề (LAG, LEAD) để phát hiện thay đổi, bất thường.
  • Tạo thứ hạng, xếp loại (RANK, DENSE_RANK) khi giám sát hiệu năng, tần suất truy vấn.
  • Tạo số thứ tự (ROW_NUMBER) khi cần gán ID tạm hoặc kiểm tra bản ghi trùng lặp.
  • Phân tích xu hướng, lịch sử thay đổi dữ liệu, hoặc biến động giao dịch hệ thống.

🧠 2️⃣. Tổng quan các hàm

Hàm Mục đích Cú pháp cơ bản
LAG() Lấy giá trị của bản ghi trước đó trong cùng nhóm LAG(column, offset, default) OVER (PARTITION BY ... ORDER BY ...)
LEAD() Lấy giá trị của bản ghi sau đó LEAD(column, offset, default) OVER (...)
ROW_NUMBER() Đánh số thứ tự duy nhất trong mỗi nhóm ROW_NUMBER() OVER (...)
RANK() Xếp hạng, nhưng có thể nhảy số khi trùng hạng RANK() OVER (...)
DENSE_RANK() Xếp hạng liền kề, không nhảy số DENSE_RANK() OVER (...)

🧩 3️⃣. Ứng dụng thực tế trong nghiệp vụ quản trị dữ liệu Kho bạc

🧾 Ví dụ 1 — Theo dõi biến động số dư hàng ngày

Giả sử bảng giao_dich_tien_gui lưu:

ngay_gd ma_tk so_du
2025-01-01 TK001 1,000,000
2025-01-02 TK001 1,050,000
2025-01-03 TK001 950,000

Mục tiêu: Tính chênh lệch so với ngày trước → phát hiện bất thường.

SELECT 
  ma_tk,
  ngay_gd,
  so_du,
  LAG(so_du, 1, 0) OVER (PARTITION BY ma_tk ORDER BY ngay_gd) AS so_du_truoc,
  so_du - LAG(so_du, 1, 0) OVER (PARTITION BY ma_tk ORDER BY ngay_gd) AS chenhlech
FROM giao_dich_tien_gui;

📊 Kết quả:

ma_tk ngay_gd so_du so_du_truoc chenhlech
TK001 2025-01-01 1,000,000 0 +1,000,000
TK001 2025-01-02 1,050,000 1,000,000 +50,000
TK001 2025-01-03 950,000 1,050,000 -100,000

👉 Dễ dàng phát hiện biến động bất thường (-100,000).

⚙️ Ví dụ 2 — Giám sát hiệu năng truy vấn

Giả sử bảng log_truyvan có:
| user | thoi_gian | so_lan_truyvan |

Mục tiêu: So sánh số lần truy vấn hiện tại và trước đó.

SELECT 
  user,
  thoi_gian,
  so_lan_truyvan,
  LAG(so_lan_truyvan) OVER (PARTITION BY user ORDER BY thoi_gian) AS lan_truoc,
  so_lan_truyvan - LAG(so_lan_truyvan) OVER (PARTITION BY user ORDER BY thoi_gian) AS tang_giam
FROM log_truyvan;

📌 Ứng dụng:

  • Theo dõi user đột ngột tăng tần suất truy vấn.
  • Cảnh báo truy cập bất thường hoặc tấn công từ nội bộ.

📊 Ví dụ 3 — Phân loại mức độ tải của máy chủ (RANK)

Bảng hieu_nang_server:
| may_chu | ngay | so_truyvan |

SELECT 
  ngay,
  may_chu,
  so_truyvan,
  RANK() OVER (PARTITION BY ngay ORDER BY so_truyvan DESC) AS thu_hang
FROM hieu_nang_server;

→ Cho biết máy chủ nào đang tải cao nhất mỗi ngày.

🧾 Ví dụ 4 — Gán mã duy nhất cho bản ghi trùng (ROW_NUMBER)

SELECT 
  ROW_NUMBER() OVER (PARTITION BY ma_tk ORDER BY ngay_gd) AS stt,
  *
FROM giao_dich_tien_gui;

→ Phát hiện bản ghi trùng lặp hoặc sai thứ tự thời gian.

🔍 4️⃣. Mở rộng trong giao dịch và quản trị hệ thống

Mục tiêu quản trị Hàm hỗ trợ Ứng dụng
Phát hiện sai lệch số dư hoặc dữ liệu bị rollback LAG, LEAD So sánh dữ liệu giữa 2 snapshot
Theo dõi tăng trưởng hoặc suy giảm hiệu năng LAG, LEAD, RANK Theo dõi log performance
Kiểm tra bản ghi trùng ROW_NUMBER() Xác định và dọn dữ liệu trùng
Xếp loại truy vấn chậm RANK() Ưu tiên tối ưu nhóm 1
Xếp hạng chi nhánh có khối lượng giao dịch cao DENSE_RANK() Thống kê theo ngày/tháng

🧮 5️⃣. Kỹ năng thực hành gợi ý (trong lab)

Bài tập Mục tiêu Hàm trọng tâm
So sánh doanh thu kỳ trước và kỳ này Biến động dữ liệu LAG, LEAD
Xếp hạng chi nhánh theo tổng tiền gửi Thống kê RANK, DENSE_RANK
Tìm dữ liệu trùng hoặc bản ghi sai lệch Làm sạch dữ liệu ROW_NUMBER()
Theo dõi sự thay đổi giá trị giữa hai trạng thái Giám sát LAG, LEAD

⚙️ 6️⃣. Cấu trúc kỹ thuật trong MySQL Workbench

Trong Workbench:

  • Vào SQL Editor → Query Tab → Run Script để thực hành các ví dụ trên.
  • Dùng Visual Explain để xem kế hoạch thực thi (execution plan) và hiệu năng hàm cửa sổ.
  • Dùng Performance Schema hoặc Sys Schema để so sánh kết quả thực tế giữa các truy vấn có/không dùng hàm window.

📘 7️⃣. Kết luận

Điểm khác biệt MySQL 8.0 trở lên Oracle / SQL Server
Hỗ trợ đầy đủ window functions ✅ Có (từ 8.0) ✅ Có từ lâu
Cú pháp tương tự OVER (PARTITION BY ... ORDER BY ...) Gần như tương đồng
Tối ưu hiệu năng Nên có index phù hợp Giống nguyên tắc Oracle
Ứng dụng Báo cáo, kiểm soát, giám sát dữ liệu Tương tự Oracle / SQL Server

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *