哪一个是找到第n个最高薪水的好方法

时间:2014-10-17 06:54:46

标签: sql

为了从表中找到第n个最高薪水,有不同的方式:

如果我想找到第三高薪,那么

1)

select MIN(sal)
from ( select distinct top 3 sal from chksal order by sal desc) as a;

2)

select distinct sal 
from chksal x where 3=(select COUNT(distinct sal) from chksal y where x.sal<=y.sal);

3)

select distinct sal 
from chksal x where 2=(select COUNT(distinct sal) from chksal y where x.sal<y.sal);

4)

select top 1 sal  
from ( select distinct top 3 sal from chksal order by sal desc) result order by sal;

据我所知,这些都是方法。

任何人都可以告诉其他方法吗?

哪一个最适合根据性能进行查询

4 个答案:

答案 0 :(得分:1)

获得第n个最高值:

SELECT *
FROM table_name
ORDER BY column_name DESC
LIMIT n - 1, 1

查询只返回n-1行后的第一行,因此您获得第n个最高记录。

答案 1 :(得分:1)

要测试性能,您应该尝试使用您的数据在系统上进行各种查询。而且,如果您关心性能,您应该了解执行计划并学习如何阅读它们。如果我不得不猜测,第一个和第四个会有更好的表现。

但是。对于您想要做的事情,有一个名为dense_rank()的内置函数:

select top 1 salary
from (select cv.*, dense_rank() over (order by salary desc) as r 
      from chkksal cv
     ) cv
where r = 3;

作为一个说明。这使用top而没有order by。通常不鼓励这样做,但r = 3相同的所有工资都是一样的,所以在这种情况下也可以。

此外,还使用了dense_rank(),因为您的查询中包含distinct。如果你想要将重复项分开计算(例如,&#34; 100,100,200,300和#34;会给你&#34; 200&#34;而不是&#34; 300&#34;),然后使用row_number()

答案 2 :(得分:0)

你可以使用Row_Number()

来做到这一点
SELECT * FROM (
          SELECT ROW_NUMBER() OVER (ORDER BY score ASC) AS RowNumber,
          *
          FROM student
     ) AS foo
    WHERE RowNumber = 3

或者您也可以使用OFFSET

SELECT score FROM table ORDER BY score ASC LIMIT 1 OFFSET 3

答案 3 :(得分:0)

我认为简单的解决方案可能如下 在这种情况下,它将为您提供第n个最高数量。

SELECT TOP 1 Quantity FROM (
SELECT TOP N Quantity FROM [Order Details] 
ORDER BY Quantity DESC ) temp
ORDER BY Quantity

如果要列出所有n次最高的记录,可以使用以下

SELECT * FROM [Order Details] WHERE Quantity IN (
    SELECT TOP 1 Quantity FROM (
    SELECT TOP 10 Quantity FROM [Order Details] 
    ORDER BY Quantity DESC ) temp
    ORDER BY Quantity)

您可以根据需要更改表格和列名称