SQL 排名不符合预期

SQL Rank does not work as expected

我正在尝试使用 SQL 函数 Rank() 来获取几个组的最高记录列表。这是不起作用的即时消息:

select hc.hId, hc.DpId, hc.Rank 
from (
    select d.hId, DpId, Rank()
        OVER (Partition by DpId ORDER BY d.hId) AS Rank
    FROM CurDp d
    INNER JOIN HostList h on d.DpId = h.hId
    INNER JOIN Coll_hList pch on d.hId = pch.hId
    where h.Model = 'PRIMARY'  
) hc where hc.Rank <= 10

我得到前 10 条记录如下:

 HId    | DpId | Rank
 -------x------x------
  7     | 590  | 1
  18    | 590  | 2
  23    | 590  | 3
  24    | 590  | 4
  26    | 590  | 5
  36    | 590  | 6
  63    | 590  | 7
  80    | 590  | 8
  84    | 590  | 9
  88    | 590  | 10

但是当我使用 CROSS APPLY 时,这是我需要的功能,因为我必须在不同的模型上获得那种记录,我使用此代码:

select pch.hId, cc.DpId, cc.Rank from from Coll_hList pch
cross apply
(
    select hc.hId, hc.DpId, hc.Rank 
    from (
        select d.hId, DpId, Rank()
            OVER (Partition by DpId ORDER BY d.hId) AS Rank
        FROM CurrDp d
        INNER JOIN HostList h on d.DpId = h.hId
        where h.Model = 'PRIMARY' and d.hId = pch.hId
    ) hc where hc.Rank <= 10
) cc

在这里,我总是排名 1,它不过滤任何东西(不显示整个结果):

HId    | DpId | Rank
-------x------x------
7        590    1
18       590    1
23       590    1
24       590    1
26       590    1
36       590    1
63       590    1
80       590    1
84       590    1
88       590    1
124      590    1
125      590    1
133      590    1

我做错了吗?是因为 CROSS APPLY 吗?

我也使用了 dense_rank() 而不是 rank(),但它显​​示了相同的结果。

如果您能通过 CROSS APPLY 帮助实现此请求,我们将不胜感激。

谢谢

在第一种情况下,您加入 Coll_hList 并获得超过 10 个条目的结果集,然后进行排名。

在第二种情况下,在您的申请子select中,您只创建了一个单项结果集。排名第一。

你的排序必须在外层声明中完成:

select pch.hId, cc.DpId, Rank()
            OVER (Partition by cc.DpId ORDER BY cc.hId) AS Rank 
from  Coll_hList pch
cross apply
(
        select d.hId, DpId
        FROM CurrDp d
        INNER JOIN HostList h on d.DpId = h.hId
        where h.Model = 'PRIMARY' and d.hId = pch.hId

) cc