为了从表中找到第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;
据我所知,这些都是方法。
任何人都可以告诉其他方法吗?
哪一个最适合根据性能进行查询
答案 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)
您可以根据需要更改表格和列名称