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

PostgreSQL 13:GIỚI HẠN… CÓ TIES

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;
bộ phận
name lương
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;
bộ phận
name lương
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;
bộ phận
name lương
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ẻ!


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Các truy vấn kiểu CHỌN có phải là kiểu duy nhất có thể được lồng vào nhau không?

  2. Chuyển một hàng thành nhiều hàng với ít cột hơn

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

  4. GROUP BY và COUNT trong PostgreSQL

  5. Ràng buộc NOT NULL trên một tập hợp các cột