【发布时间】:2012-12-07 10:17:33
【问题描述】:
我有两张表 RSLTS 和 CONTACTS:
RSLTS
QRY_ID | RES_ID | SCORE
-----------------------------
A | 1 | 15
A | 2 | 32
A | 3 | 29
C | 7 | 61
C | 9 | 30
联系方式
C_ID | QRY_ID | RES_ID
----------------------------
1 | A | 2
2 | A | 1
3 | C | 9
我正在尝试创建一个报告,该报告将为每个 CONTACT 记录 (C_ID) 在 RSLTS 组内的表 (QRY_ID)。使用上面的数据,它看起来像这样:
C_ID | QRY_ID | RES_ID | SCORE | Rank
-----------------------------------------------
1 | A | 2 | 32 | 1
2 | A | 1 | 15 | 3
3 | C | 9 | 30 | 2
到目前为止,我尝试了这个,但它返回最后一行的 Rank = 1(第二行的 rank = 2,这也是错误的)
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
更新:SQLFiddle
【问题讨论】:
-
你确定吗? I get your expected results。另外,所有的缩写是怎么回事?你真的是指
DENSE_RANK()(这将缩小排名之间的“差距”)吗? -
感谢 SQLFiddle。我在本地获得的数据显示了一些不同的东西。我更新了这个 SQLFiddle (sqlfiddle.com/#!3/6ef2f/1) 中的数据,其中最后一条记录应该显示 rank = 2 而不是 1,因为 61 > 30
-
目前你的结果相当于
RANK() OVER(ORDER BY r.score DESC)....你确定要分区吗(你的排名没有重复)。
标签: sql sql-server-2008 rank