如何在SQL Server中的表中找到第n个最高值

时间:2016-07-05 18:15:54

标签: sql-server

以下查询中找到表中第n个最高值的逻辑是什么?

select * 
from tablename as a 
where (n-1) = (select count(distinct(column name) 
               from tablename as b 
               where b.columname > a.columnname)

示例查询:

select * 
from tblperson a 
where 3 = (select count(distinct(expenses)) 
           from tblperson b 
           where b.Expenses > a.Expenses)

3 个答案:

答案 0 :(得分:2)

您可以使用OFFSET FETCH Clause (SQL Server Compact)功能:

SELECT *
FROM tablename
ORDER BY expenses DESC
OFFSET N - 1 ROWS -- Nth highest (N-1 offset)
FETCH NEXT 1 ROWS ONLY;

答案 1 :(得分:0)

查询说明每一行都要计算表中有多少唯一值,其值(在特定列中)大于我正在查看的值。只保留那些落在某个位置的(可能的关系)。因此,对于第四名,您将期望找到3个更高的值。

这是通过称为相关子查询的内部查询来完成的。虽然服务器可能有更有效的方法来实际计算结果,但您可以将其视为一个带有函数调用的循环。对于外部查询中的每一行,内部查询在逻辑上执行一次,并且对于每次运行,其中a的引用都是常量。

以这种方式重写可能有助于您理解。 (你也可以自己测试内部查询。)

select * from
(
    select
        a.columnname,
        (
            select count(distinct columnname)
            from tablename as b 
            where b.columnname > a.columnname
        ) as NumRowsGreater
    from tablename as a
) as t
where NumRowsGreater = (n-1)

答案 2 :(得分:0)

在SQL-Server中

试试这个

select TOP 3 * FROM tblperson order by Expenses DESC

或者存储过程中的类似内容

select TOP @N * FROM tblperson order by Expenses DESC