SQL Rank无法按预期工作

时间:2015-10-12 09:17:43

标签: sql-server tsql rank cross-apply

我试图使用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

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

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获得此请求的帮助。

由于

1 个答案:

答案 0 :(得分:4)

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

在第二种情况下,在apply-sub-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