将结果限制在前 2 个排名行

UB0*_*B01 24 sql-server-2008 sql-server t-sql window-functions rank

在SQL Server 2008中,我使用RANK() OVER (PARTITION BY Col2 ORDER BY Col3 DESC)与返回的数据集RANK。但是我每个分区有数百条记录,所以我将从等级 1、2、3......999 中获取值。但我只想RANKs在每个PARTITION.

例子:

ID   Name    Score    Subject
1    Joe      100      Math
2    Jim      99       Math
3    Tim      98       Math
4    Joe      99       History
5    Jim      100      History
6    Tim      89       History
7    Joe      80       Geography
8    Tim      100      Geography
9    Jim      99       Geography
Run Code Online (Sandbox Code Playgroud)

我希望结果是:

SELECT Subject, Name, RANK() OVER (PARTITION BY Subject ORDER BY Score DESC)
FROM Table
Run Code Online (Sandbox Code Playgroud)
Subject        Name      Rank
Math           Joe        1
Math           Jim        2
History        Jim        1
History        Joe        2
Geography      Tim        1
Geography      Jim        2
Run Code Online (Sandbox Code Playgroud)

我只想在每个类别中排名 1 和 2。我该怎么做呢?

Der*_*omm 18

select * from (
SELECT Subject, Name, RANK() OVER (PARTITION BY Subject ORDER BY Score DESC) as RN
FROM Table
) a
where a.RN <= 2
Run Code Online (Sandbox Code Playgroud)


Con*_*lls 15

您可以将原始查询 usingrank()放入子查询中,并使用过滤结果的查询包装它。