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