gpt4 book ai didi

sql-server - SQL Rank 未按预期工作

转载 作者:行者123 更新时间:2023-12-03 02:56:46 25 4
gpt4 key购买 nike

我正在尝试使用 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 多个条目的结果集,然后对这些条目进行排名。

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

关于sql-server - SQL Rank 未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33077426/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com