2

我有一张桌子;包含 2 个字段,姓名和薪水。我使用下面的脚本来找到第三个最高薪水。

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

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

4

7 回答 7

4
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

希望现在很清楚。

于 2013-03-18T10:43:57.210 回答
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;
于 2013-03-18T10:31:34.083 回答
1

用这个....

SELECT DISTINCT sal FROM downtodate1.emp e1
WHERE 2 = (SELECT COUNT(DISTINCT sal) FROM downtodate1.emp e2 WHERE e1.sal> e2.sal);

WHERE 0 =第 1 高 Sal

WHERE 1 =第二高的萨尔

WHERE 2 =第三高的萨尔

WHERE 3 = 第四高 Sal

索引从零开始(0)

而不是这个...

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

于 2021-02-02T08:05:03.223 回答
0

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

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

N 是第 N 个数。

于 2013-03-18T10:17:54.683 回答
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) 计算,但在这种情况下可能就足够了。

于 2013-03-18T10:19:10.303 回答
0

这 3 和你写的一样

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

其中 a = 3

或其中 3 = 不同 sal 的计数

于 2013-03-18T10:45:11.653 回答
0

使用子查询检索员工最高工资记录的简单方法

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

于 2018-02-14T14:56:22.580 回答