Sql server SQL列组未按预期工作

Sql server SQL列组未按预期工作,sql-server,tsql,rank,cross-apply,Sql Server,Tsql,Rank,Cross Apply,我正在尝试使用SQL函数Rank()来获取几个组的顶级记录列表。以下是不起作用的im字符串: 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

我正在尝试使用SQL函数Rank()来获取几个组的顶级记录列表。以下是不起作用的im字符串:

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
但当我使用交叉应用时,我需要这个函数,因为我必须在不同的模型上获取此类记录,我使用以下代码:

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
我做错了吗?是因为交叉申请吗

我还使用了densite_rank()而不是rank(),但它显示了相同的结果

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


谢谢

在第一种情况下,您可以在
Coll_hList
上加入,并获得10多个条目的结果集,然后对这些条目进行排名

在第二种情况下,在apply子选择中,只创建一个条目结果集。排名结果是排名第一

您的排名必须在外部声明中完成:

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

嗨,谢谢你的回答,效果很好。我只是不明白你的“一次输入结果集”。你的意思是排名方法只能看到一个无法排序的结果吗?没错。交叉应用语法为以前执行的联接计算的结果集的每一行创建某种“临时表”(至少有助于这样考虑),然后只与特定行联接。在您的情况下,临时表只有一行。
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
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