SQL RANK() over PARTITION 在连接表上

Posted

技术标签:

【中文标题】SQL RANK() over PARTITION 在连接表上【英文标题】:SQL RANK() over PARTITION on joined tables 【发布时间】: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)....你确定要分区吗(你的排名没有重复)。 【参考方案1】:
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

【讨论】:

请不要提供仅代码的答案,但请解释解决方案为何/如何工作。另外请编辑您的代码以正确显示。 当然,下次会做。只是一个新手,并尝试回答问题。感谢您的建议。 您仍然可以编辑您的帖子并添加说明!【参考方案2】:

因为排名完全不依赖于联系人

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

因此:

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

【讨论】:

以上是关于SQL RANK() over PARTITION 在连接表上的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server Rank() Over Partition w/Back and Forth 值

sql over表示啥意思

over在SQL里就啥意思

OVER(PARTITION BY) 函数

SQL over的作用及用法

sql查询解释:oracle的rank和partition