Một trong những tính năng mới trong PostgreSQL 13 là WITH TIES
theo tiêu chuẩn SQL mệnh đề sử dụng với LIMIT
- hoặc, như cách gọi tiêu chuẩn, FETCH FIRST n ROWS
. Cảm ơn Surafel Temesgen là tác giả bản vá ban đầu; Tomas Vondra và của bạn thực sự cho một số bản sửa lỗi mã bổ sung; và các nhà phê bình Andrew Gierth và Erik Rijkers. Bạn có thể xem xét thông điệp cam kết.
Mối quan hệ rất thường xuyên khi xếp hạng mọi thứ; ví dụ:trong một cuộc đua kín, bạn có thể có nhiều mối quan hệ và chắc chắn rằng bạn không muốn tước giải thưởng của những người tham gia! Cái gì WITH TIES
thực hiện khá đơn giản:nó thêm bất kỳ hàng nào sau đây hoặc các hàng vào tập hợp kết quả của bạn, nếu chúng xếp hạng bằng hàng cuối cùng được trả về theo LIMIT
, theo ORDER BY
mệnh đề.
Nếu bạn chỉ muốn có hai nhân viên có mức lương cao nhất, bạn có thể làm như sau:
SELECT * FROM employees ORDER BY salary DESC LIMIT 2;
name | lương | bộ phận|
---|---|---|
Alicia | 1600 | kỹ thuật |
Oruga | 1500 | tiếp thị |
Vì vậy, bạn có ngứa muốn biết mức lương của người tiếp theo? Điều gì sẽ xảy ra nếu cô ấy phù hợp với Oruga, và bị loại bởi một sự tình cờ hay vận rủi? Điều đó có thể xảy ra, như bạn cũng biết; và may mắn thay, WITH TIES
bây giờ ở đó để tiết kiệm trong ngày. (Lưu ý rằng trên thực tế, chúng tôi không xử lý WITH TIES
trong LIMIT
mệnh đề như vậy. Bạn phải sử dụng FETCH FIRST
cú pháp, là cú pháp bắt buộc theo tiêu chuẩn, để có thể sử dụng WITH TIES
.)
SELECT * FROM employees ORDER BY salary DESC FETCH FIRST 2 ROWS WITH TIES;
name | lương | bộ phận|
---|---|---|
Alicia | 1600 | kỹ thuật |
Oruga | 1500 | bán hàng |
Conejo Blanco | 1500 | tiếp thị |
Ở đó! Thỏ trắng đã để được liệt kê, và bây giờ anh ấy đang ở.
Một vài lưu ý trước khi bạn quá điên. LIMIT
(hay chính xác hơn là FETCH FIRST
) không còn hứa hẹn trả về chính xác số hàng bạn chỉ định. Bạn có thể có thêm hai hoặc hai mươi hàng hoặc gấp 100 lần số hàng mà bạn yêu cầu. Trong số những điều khác, điều này có nghĩa là bạn cần theo dõi số hàng bạn đã thấy cho đến nay, nếu bạn đang phân trang kết quả. Ở trên, bạn có ba hàng, vì vậy, đối với trang tiếp theo, bạn bỏ qua nhiều hàng đó bằng cách thêm đúng OFFSET
mệnh đề:
SELECT * FROM employees
ORDER BY salary DESC
FETCH FIRST 2 ROWS WITH TIES
OFFSET 3;
name | lương | bộ phận|
---|---|---|
Falsa Tortuga | 1400 | tiếp thị |
Duquesa | 1300 | bán hàng |
Liebre de Marzo | 1300 | kỹ thuật |
Chúng tôi một lần nữa nhận được ba thay vì chỉ hai như chúng tôi yêu cầu. Vì vậy, đối với trang tiếp theo, bạn sẽ phải bỏ qua sáu. Và như thế. Hãy chắc chắn rằng có đủ đồ lót cho mọi người.
Một điều khác cần lưu ý là bạn phải đảm bảo chỉ sử dụng ORDER BY
mệnh đề phù hợp với WITH TIES
mệnh đề; giả sử, nếu bạn muốn có các hàng có cùng mức lương được sắp xếp theo tên, bạn phải sử dụng một truy vấn con. Nếu không, sự khác biệt trong tên sẽ giải quyết ràng buộc về tiền lương, vì vậy hàng tiếp theo sẽ không được đưa vào. Ví dụ:
SELECT * FROM (
SELECT * FROM employees
ORDER BY salary DESC
FETCH FIRST 2 ROWS WITH TIES) AS subq
ORDER BY salary DESC, name;
Tính năng này ở đó để giúp bạn hiển thị tất cả các hàng có cùng giá trị - nó cho phép bạn không phân biệt đối xử với một số hàng có giá trị bằng nhau chỉ dựa trên vị trí thực trong bảng.
Chúc bạn phân trang vui vẻ!