SQL 排名不符合预期
SQL Rank does not work as expected
我正在尝试使用 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 个条目的结果集,然后进行排名。
在第二种情况下,在您的申请子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 函数 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 个条目的结果集,然后进行排名。
在第二种情况下,在您的申请子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