AVG là con số dễ tính nhất và dễ gây hiểu nhầm nhất. Một người lương cao kéo lệch cả báo cáo.
Bài toán
Bốn mức lương: 3.000, 4.000, 5.000 và 9.000. Trung bình là 5.250 — cao hơn lương của ba trên bốn người. Con số đúng về mặt toán học nhưng sai về mặt mô tả.
Trung vị: PERCENTILE_CONT
SELECT
PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY luong) AS trung_vi,
PERCENTILE_CONT(0.9) WITHIN GROUP (ORDER BY luong) AS p90
FROM nhan_vien;
Chạy trên PostgreSQL, SQL Server và Oracle. PERCENTILE_DISC trả về một giá trị có thật trong bảng, còn PERCENTILE_CONT nội suy giữa hai giá trị.
Trung vị trên MySQL — không có hàm sẵn
WITH danh_so AS (
SELECT luong,
ROW_NUMBER() OVER (ORDER BY luong) AS rn,
COUNT(*) OVER () AS tong
FROM nhan_vien
)
SELECT AVG(luong) AS trung_vi
FROM danh_so
WHERE rn IN (FLOOR((tong+1)/2), CEIL((tong+1)/2));
Mẹo: lấy hai dòng giữa rồi tính trung bình — đúng với cả số lượng chẵn và lẻ. Đây chính là lời giải HackerRank Weather Observation Station 20.
NTILE: chia thành N nhóm bằng nhau
SELECT
ten, luong,
NTILE(4) OVER (ORDER BY luong) AS nhom_tu_phan
FROM nhan_vien;
Dùng để phân khúc khách hàng theo chi tiêu, chia học viên theo điểm, xếp sản phẩm theo doanh số.
PERCENT_RANK: vị trí tương đối
SELECT ten, luong,
ROUND(100 * PERCENT_RANK() OVER (ORDER BY luong), 1) AS phan_tram_duoi
FROM nhan_vien;
Trả về “bao nhiêu phần trăm người có lương thấp hơn tôi”.
Lỗi thường gặp
1. Dùng AVG cho dữ liệu lệch
Lương, thời gian phản hồi, giá trị đơn hàng đều là dữ liệu lệch phải. Với chúng, median mô tả đúng hơn. Báo cáo tốt thường có cả hai.
2. Nhầm NTILE với chia theo giá trị
NTILE chia theo số dòng, không theo khoảng giá trị. Với 100 người, mỗi nhóm luôn có 25 người, dù chênh lệch lương giữa các nhóm rất khác nhau.
3. Quên rằng NTILE cần ORDER BY
Không có ORDER BY thì việc chia nhóm là ngẫu nhiên và vô nghĩa.
Luyện tập
- HackerRank — Weather Observation Station 20 (median)
- LeetCode 569 — Median Employee Salary
- LeetCode 571 — Find Median Given Frequency of Numbers
- LeetCode 1077 — Project Employees III
Tóm lại
- Dữ liệu lệch thì median mô tả đúng hơn trung bình.
PERCENTILE_CONT(0.5)là cách chuẩn tính median.- MySQL không có hàm median — dùng
ROW_NUMBERlấy hai dòng giữa. NTILEchia theo số dòng, không theo khoảng giá trị.- Báo cáo tốt hiển thị cả trung bình lẫn trung vị.
Bạn vừa học xong trung vị và phân vị
Sẵn sàng luyện tập chưa?
Làm bài tập trung vị và phân vị trên dữ liệu thật, chấm điểm ngay khi bạn bấm chạy.
Bắt đầu luyện tập →