Lấy top N ngày mới nhất duy nhất (DISTINCT) trong MySQL
Kết hợp DISTINCT trong subquery để loại bỏ ngày trùng, sau đó ORDER BY DESC và LIMIT 3 để lấy 3 ngày lớn nhất.
1. Tạo bảng và chèn dữ liệu (có ngày trùng)
mysql> CREATE TABLE DemoTable (AdmissionDate DATE);
mysql> INSERT INTO DemoTable VALUES
('2019-09-04'), ('2019-08-10'), ('2019-09-21'), ('2019-09-18'),
('2019-09-21'), ('2019-08-18'), ('2019-09-18'), ('2019-09-16');
2. Xem dữ liệu (8 hàng, có trùng)
mysql> SELECT * FROM DemoTable;
+---------------+ | AdmissionDate | +---------------+ | 2019-09-04 | | 2019-08-10 | | 2019-09-21 | | 2019-09-18 | | 2019-09-21 | ← trùng | 2019-08-18 | | 2019-09-18 | ← trùng | 2019-09-16 | +---------------+
3. Truy vấn: 3 ngày mới nhất KHÔNG TRÙNG
mysql> SELECT AdmissionDate FROM (
SELECT DISTINCT AdmissionDate FROM DemoTable
) AS tbl
ORDER BY AdmissionDate DESC
LIMIT 3;
4. Kết quả
+---------------+ | AdmissionDate | +---------------+ | 2019-09-21 | | 2019-09-18 | | 2019-09-16 | +---------------+
Giải thích:
- Subquery
SELECT DISTINCT AdmissionDate: Loại trùng → 6 ngày duy nhất ORDER BY DESC: Sắp xếp mới đến cũLIMIT 3: Lấy 3 hàng đầu
Các ngày duy nhất theo thứ tự giảm:
- 2019-09-21
- 2019-09-18
- 2019-09-16
- 2019-09-04
- 2019-08-18
- 2019-08-10
MySQL 8.0+ dùng CTE (dễ đọc hơn):
WITH distinct_dates AS (
SELECT DISTINCT AdmissionDate FROM DemoTable
)
SELECT AdmissionDate FROM distinct_dates
ORDER BY AdmissionDate DESC LIMIT 3;
Lưu ý: Nên có index trên cột Date để tối ưu ORDER BY + LIMIT.