Trung bình lương 5.250 khi ba trong bốn người nhận dưới 5.000

Nâng cao 5 phút đọc Cập nhật 30/07/2026 UPA AI Partner

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ả.

4 DÒNGluong3000400050009000BA CÁCH ĐOchỉ sốgiá trịAVG5250MEDIAN4500NTILE(4) = 13000Một giá trị lớn kéo AVG lệch hẳnPERCENTILE_CONT

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_NUMBER lấy hai dòng giữa.
  • NTILE chia 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 →