Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

SQL chỉ chọn các hàng có giá trị tối đa trên một cột

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

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-identifiermax-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:

  1. Đ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
  2. 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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Doctrine 2 và bảng liên kết Nhiều đến nhiều với một trường bổ sung

  2. Sử dụng chế độ xem MySQL

  3. Cách hoạt động của hàm LOCATE () trong MySQL

  4. Cân bằng tải cơ sở dữ liệu trong đám mây - MySQL Master Failover với ProxySQL 2.0:Part One (Deployment)

  5. Tham gia so với truy vấn phụ