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
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)? –
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
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). –