SQL中的第N个最大工资查询

时间:2013-03-18 10:11:52

标签: mysql sql

我有一张桌子;包含2个字段,名称和工资。我使用下面的脚本来找到第3个最高工资。

SELECT DISTINCT sal 
FROM downtodate1.emp e1  
WHERE 3 = (SELECT COUNT(DISTINCT sal) FROM downtodate1.emp e2 WHERE e1.sal<= e2.sal);

我想知道它是如何工作的以及为什么使用3?

7 个答案:

答案 0 :(得分:2)

select distinct sal 
from downtodate1.emp AS e1  
where 3 = (
    select count(distinct sal) 
    from downtodate1.emp e2 
    where e1.sal <= e2.sal
);

考虑你有一个这样的表:

sal
---
3
3
2
1
1
0

有了这部分

select distinct sal 
from downtodate1.emp AS e1 

你会得到结果

sal
---
3
2
1
0

这使得4个不同的工资。

现在是子查询

    select count(distinct sal) 
    from downtodate1.emp e2 
    where e1.sal <= e2.sal
对主查询中的每一行执行

。它计算主要查询中行的低于或等于的不同值的数量。所以结果实际上是(但没有显示):

sal | count(distinct sal) where e1.sal <= e2.sal
------------------------------------------------
3     1
3     1
2     2
1     3
1     3
0     4

与主查询不同,您将得到以下结果:

sal | count(distinct sal) where e1.sal <= e2.sal
------------------------------------------------
3     1
2     2
1     3
0     4

并且使用WHERE条款3 = (/*subquery*/),您只能获得

sal | count(distinct sal) where e1.sal <= e2.sal
------------------------------------------------
1     3

这一行。结果是1

希望现在很清楚。

答案 1 :(得分:1)

这是一种更快的方法......

 SELECT salary
   FROM
      (
        SELECT salary
             , @prev := @curr
             , @curr := salary
             , @rank := IF(@prev = @curr, @rank, @rank+1) rank
          FROM employee
         CROSS
          JOIN 
             ( SELECT @curr := null, @prev := null, @rank := 0) sel1
         ORDER 
            BY salary DESC
      ) x
  WHERE rank = 3;

答案 2 :(得分:1)

使用这个....

选择不同的萨尔 FROM downtodate1.emp e1
WHERE 2 = (SELECT COUNT(DISTINCT sal) FROM downtodate1.emp e2 WHERE e1.sal> e2.sal);

WHERE 0 = 1st High Sal

WHERE 1 = 第二高萨尔

WHERE 2 = 第三高萨尔

WHERE 3 = 4th High Sal

索引从零(0)开始

而不是这个...

选择不同的萨尔 FROM downtodate1.emp e1
WHERE 3 = (SELECT COUNT(DISTINCT sal) FROM downtodate1.emp e2 WHERE e1.sal<= e2.sal);

答案 3 :(得分:0)

相反,您可以使用它来查找第N个最高工资

SELECT sal FROM emp
ORDER BY sal DESC
LIMIT N,1

N是第N个数字。

答案 4 :(得分:0)

也许重新格式化查询将澄清:

select distinct sal 
from downtodate1.emp AS e1  
where 3 = (
    select count(distinct sal) 
    from downtodate1.emp e2 
    where e1.sal <= e2.sal
);

将子查询的结果与3进行比较,作为所需行的前一行数。这是(可能)O(N ^ 2)计算,但在这种情况下可能就足够了。

答案 5 :(得分:0)

这3与你写的相同

  where  
(select count(distinct sal) from downtodate1.emp e2 where e1.sal <= e2.sal) = 3 ;

其中a = 3

或其中3 =不同sal的计数

答案 6 :(得分:0)

使用subQueries

检索Employee的最大工资记录的简单方法

select * from Employee where salary in (select max(salary) from Employee)