2012-12-19 39 views
8

Tôi có hai bảng RSLTS và LIÊN HỆ:SQL RANK() trên phân vùng trên bảng tham gia

RSLTS

QRY_ID | RES_ID | SCORE 
----------------------------- 
    A  | 1  | 15 
    A  | 2  | 32 
    A  | 3  | 29 
    C  | 7  | 61 
    C  | 9  | 30 

LIÊN HỆ

C_ID | QRY_ID | RES_ID 
---------------------------- 
    1 | A  | 2 
    2 | A  | 1 
    3 | C  | 9 

Tôi đang cố gắng để tạo ra một báo cáo sẽ hiển thị, cho mỗi CONTACT bản ghi (C_ID), số RANK() của RES_ID (by SCORE) trong bảng RSLTS trong nhóm của nó (QRY_ID). Sử dụng các dữ liệu trên, nó sẽ trông như thế này:

C_ID | QRY_ID | RES_ID | SCORE | Rank 
----------------------------------------------- 
    1 | A  | 2  | 32 | 1 
    2 | A  | 1  | 15 | 3 
    3 | C  | 9  | 30 | 2 

Cho đến nay, tôi đã cố gắng này, nhưng nó sẽ trả về Rank = 1 cho hàng cuối cùng (và rank = 2 cho phần thứ hai mà cũng là sai)

SELECT 
    C.* 
    ,R.SCORE 
    ,RANK() OVER (PARTITION BY R.QRY_ID ORDER BY R.SCORE DESC) 
FROM CONTACTS C LEFT JOIN RSLTS R 
ON C.RES_ID = R.RES_ID 
AND C.QRY_ID = R.QRY_ID 

UPDATE: SQLFiddle

+2

Bạn có chắc chắn? [Tôi nhận được kết quả mong đợi của bạn] (http://sqlfiddle.com/#!3/da810/1). Ngoài ra, có chuyện gì với tất cả các chữ viết tắt? Và có thể bạn thực sự có nghĩa là 'DENSE_RANK() '(mà sẽ đóng' khoảng trống 'giữa bảng xếp hạng)? –

+0

Cảm ơn SQLFiddle. Các dữ liệu tôi có ở đây tại địa phương cho thấy một cái gì đó khác nhau. Tôi cập nhật dữ liệu trong SQLFiddle này (http://sqlfiddle.com/#!3/6ef2f/1) trong đó bản ghi cuối cùng sẽ hiển thị xếp hạng = 2 thay vì 1 từ 61> 30 – greener

+0

Hiện tại, kết quả của bạn tương đương với ' RANK() OVER (ORDER BY r.score DESC) '.... Bạn có chắc bạn cần phân vùng (bạn không có bất kỳ sự lặp lại nào trong thứ hạng của bạn). –

Trả lời

11

là cấp bậc không phụ thuộc vào tất cả từ danh bạ

RANKED_RSLTS

QRY_ID | RES_ID | SCORE | RANK 
------------------------------------- 
    A  | 1  | 15 | 3 
    A  | 2  | 32 | 1 
    A  | 3  | 29 | 2 
    C  | 7  | 61 | 1 
    C  | 9  | 30 | 2 

Như vậy:

SELECT 
    C.* 
    ,R.SCORE 
    ,MYRANK 
FROM CONTACTS C LEFT JOIN 
(SELECT *, 
MYRANK = RANK() OVER (PARTITION BY QRY_ID ORDER BY SCORE DESC) 
    FROM RSLTS) R 
ON C.RES_ID = R.RES_ID 
AND C.QRY_ID = R.QRY_ID 
+0

Điều này đã hiệu quả. Cảm ơn rất nhiều. – greener

0
SELECT a.C_ID,a.QRY_ID,a.RES_ID,b.SCORE,ROW_NUMBER() OVER (ORDER BY SCORE DESC) AS [RANK] 
FROM CONTACTS a JOIN RSLTS b ON a.QRY_ID=b.QRY_ID AND a.RES_ID=b.RES_ID 
ORDER BY a.C_ID 
+0

Vui lòng không cung cấp câu trả lời chỉ có mã, nhưng giải thích tại sao/giải pháp hoạt động như thế nào. Ngoài ra, vui lòng chỉnh sửa mã của bạn để hiển thị chính xác. – jotasi

+0

Chắc chắn, sẽ làm lần sau.Chỉ cần một người mới và cố gắng trả lời câu hỏi. Cảm ơn bạn đã tư vấn. –

+0

Bạn vẫn có thể chỉnh sửa bài đăng của mình và thêm giải thích! – jotasi

Các vấn đề liên quan