2012-03-09 25 views
9

Tôi đang tìm một cái gì đó tương tự này trong SQL Server:Tương đương PostgreSQL cho TOP n VỚI TIES: GIỚI HẠN "có quan hệ"?

SELECT TOP n WITH TIES FROM tablename 

tôi biết về LIMIT trong PostgreSQL, nhưng không tương đương với tồn tại trên? Tôi chỉ tò mò vì nó sẽ tiết kiệm một truy vấn thêm mỗi lần cho tôi.

Nếu tôi có bảng Numbers với thuộc tính nums: {10, 9, 8, 8, 2}. Tôi muốn làm điều gì đó như:

SELECT nums FROM Numbers ORDER BY nums DESC LIMIT *with ties* 3 

Nó sẽ trả về {10, 9, 8, 8} vì phải mất top 3 cộng với phụ 8 vì nó gắn một trong những khác.

Trả lời

8

Không có mệnh đề WITH TIES trong PostgreSQL như có trong số SQL Server.
Trong PostgreSQL tôi sẽ thay thế này cho TOP n WITH TIES .. ORDER BY <something>:

WITH cte AS (
    SELECT *, rank() OVER (ORDER BY <something>) AS rnk 
    FROM tbl 
    ) 
SELECT * 
FROM cte 
WHERE rnk <= n; 

Để được rõ ràng, rank() là đúng, dense_rank() sẽ là sai lầm (trở về quá nhiều hàng).
xem xét trích dẫn này từ các tài liệu SQL Server (từ liên kết ở trên):

Ví dụ, nếu biểu hiện được đặt là 5 nhưng 2 hàng bổ sung phù hợp với giá trị của các ORDER BY cột ở hàng 5, tập hợp kết quả sẽ chứa 7 hàng.

Công việc của WITH TIES là bao gồm tất cả các đồng nghiệp của hàng cuối cùng trong top n theo quy định của mệnh đề ORDER BY. rank() cho kết quả chính xác tương tự.

Để đảm bảo, tôi đã thử nghiệm với máy chủ SQL, dưới đây là live demo.
Và đây là một thuận tiện hơn SQLfiddle.

+1

Tại sao điều này phức tạp? Hàm rank() sẽ thực hiện chính xác những gì được yêu cầu? –

+0

@a_horse_with_no_name: Bạn hoàn toàn đúng (như tôi, lúc đầu) Những cân nhắc thứ hai của tôi không được cho. –

+0

@Erwin: đó là tốt đẹp (http://data.stackexchange.com/stackoverflow/query/63525/top-n-with-ties), tôi không biết stackoverflow có một mô-đun tích hợp để chạy truy vấn :-) Mặc dù đầu ra của 10,10,9 cho 10,9,8,8,2,10 là không chính xác nếu bạn cần để có được top 3 (10,9,8) và liệt kê tất cả những 10,9,8; sẽ là: 10,10,9,8,8. 'WITH TIES' có thể không chính xác đối với một số trường hợp có vấn đề nhất định: http://stackoverflow.com/questions/2611822/distinct-with-count-and-sql-server-2005/2612456#2612456 –

2

Hãy thử điều này:

Output: 10, 9, 8, 8

with numbers (nums) as (
  values (10), (9), (8), (8), (2) 
)  
SELECT nums FROM Numbers  
WHERE nums in (SELECT DISTINCT nums FROM Numbers ORDER BY nums DESC LIMIT 3) 
ORDER BY nums DESC 

Output: 10,10,9,8,8

with numbers (nums) as (
    values (10), (9), (8), (8), (2), (10) 
) 
SELECT nums FROM Numbers 
WHERE nums in (SELECT DISTINCT nums FROM Numbers ORDER BY nums DESC LIMIT 3) 
ORDER BY nums DESC 
Các vấn đề liên quan