我试图使用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获得此请求的帮助。
由于
答案 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