Thoạt nhìn ...
Tất cả những gì bạn cần là GROUP BY
mệnh đề với MAX
chức năng tổng hợp:
SELECT id, MAX(rev)
FROM YourTable
GROUP BY id
Nó không bao giờ đơn giản phải không?
Tôi chỉ nhận thấy rằng bạn cần content
cũng như cột.
Đây là một câu hỏi rất phổ biến trong SQL:tìm toàn bộ dữ liệu cho hàng với một số giá trị tối đa trong một cột cho một số định danh nhóm. Tôi đã nghe điều đó rất nhiều trong suốt sự nghiệp của mình. Thực ra, đó là một trong những câu hỏi tôi đã trả lời trong cuộc phỏng vấn kỹ thuật cho công việc hiện tại của mình.
Trên thực tế, nó phổ biến đến mức cộng đồng Stack Overflow đã tạo một thẻ duy nhất chỉ để giải quyết các câu hỏi như thế này: great-n-per-group .
Về cơ bản, bạn có hai cách tiếp cận để giải quyết vấn đề đó:
Tham gia với group-identifier, max-value-in-group
Truy vấn phụ
Trong cách tiếp cận này, trước tiên bạn tìm thấy group-identifier, max-value-in-group
(đã được giải quyết ở trên) trong một truy vấn phụ. Sau đó, bạn tham gia bảng của mình vào truy vấn phụ với sự bình đẳng trên cả group-identifier
và max-value-in-group
:
SELECT a.id, a.rev, a.contents
FROM YourTable a
INNER JOIN (
SELECT id, MAX(rev) rev
FROM YourTable
GROUP BY id
) b ON a.id = b.id AND a.rev = b.rev
Tự mình tham gia, điều chỉnh các điều kiện tham gia và bộ lọc
Trong cách tiếp cận này, bạn vẫn tham gia vào bảng với chính nó. Bình đẳng có trong group-identifier
. Sau đó, 2 bước di chuyển thông minh:
- Điều kiện kết hợp thứ hai là có giá trị bên trái nhỏ hơn giá trị bên phải
- Khi bạn thực hiện bước 1, (các) hàng thực sự có giá trị tối đa sẽ có
NULL
ở phía bên phải (đó làLEFT JOIN
, nhớ?). Sau đó, chúng tôi lọc kết quả đã nối, chỉ hiển thị các hàng có phía bên phải làNULL
.
Vì vậy, bạn kết thúc với:
SELECT a.*
FROM YourTable a
LEFT OUTER JOIN YourTable b
ON a.id = b.id AND a.rev < b.rev
WHERE b.id IS NULL;
Kết luận
Cả hai cách tiếp cận đều mang lại kết quả chính xác như nhau.
Nếu bạn có hai hàng với max-value-in-group
cho group-identifier
, cả hai hàng sẽ nằm trong kết quả theo cả hai cách tiếp cận.
Cả hai cách tiếp cận đều tương thích với SQL ANSI, do đó, sẽ hoạt động với RDBMS yêu thích của bạn, bất kể "hương vị" của nó.
Cả hai cách tiếp cận đều thân thiện với hiệu suất, tuy nhiên số dặm của bạn có thể khác nhau (RDBMS, Cấu trúc DB, Chỉ mục, v.v.). Vì vậy, khi bạn chọn một phương pháp tiếp cận so với phương pháp khác, điểm chuẩn . Và hãy đảm bảo rằng bạn chọn một cái có ý nghĩa nhất đối với bạn.