获得3个最高工资的查询说明

时间:2013-11-19 12:41:17

标签: sql oracle

任何人都可以解释以下查询获得3个最高薪水吗?

select distinct sal
  from emp a
where 3 >= (select count(distinct sal)
              from emp b
            where a.sal <= b.sal)
order by a.sal desc;

有人向我提出使用上述查询获得最多3次。表中的工资。我不明白查询的下面部分发生了什么:

3>= (select count(distinct sal)
       from emp b
     where a.sal <= b.sal) ;

任何人都可以解释一下吗?如果有任何其他方法可以得到相同的结果,请咨询我

7 个答案:

答案 0 :(得分:7)

   empid    sal
   ===============
    1       300
    2        50
    3       400
    4       200
    5       150
   ================

select distinct sal from emp a where 3        --outer query
  >=
 (select count(distinct sal) from emp b             --inner query(correlated)
        where a.sal <= b.sal) order by a.sal desc;
  1. 它从外部查询中获取所有记录,即emp a,并逐个迭代,将值传递给内部查询
  2. 让我们举个例子
  3. 获取第一条记录,即1和300,并将此值传递给内部查询
  4. 内部查询尝试查找小于或等于emp表b
  5. 中记录的不同sal
  6. 计数为3,因为50,200,150小于300,并且由于3> = 3(来自内部查询),答案为真,并且选择了300。
  7. 现在外循环计数器到第二行,即2和50,它传递值并检查内在查​​询,然后计数不满足3&gt; =标准,因此未选择50。
  8. 现在400,在这种情况下内部查询返回4,因此它满足标准,因此选择了400
  9. 现在200,在这种情况下内部查询返回3,因此也选择
  10. 现在150,在这种情况下内部查询返回2,因此已被过滤掉
  11. 因此选择结果为400,300,200。

答案 1 :(得分:2)

这是一种奇怪的方式,但它会起作用。基本上,对于表emp的每一行,它计算该表中的工资数量,在给定时,它们在子查询中更大:

select count(distinct sal)
       from emp b
     where a.sal <= b.sal

如果这样的工资数量不超过三个:

3>= (select count(distinct sal)
       from emp b
     where a.sal <= b.sal) 

然后这是三个最大的工资之一。


嗯,最简单的方法就是这样:

SELECT RES.SAL FROM (SELECT DISTINCT SAL FROM EMP ORDER BY 1 DESC) RES
WHERE ROWNUM <= 3

答案 2 :(得分:2)

基本上你的朋友建议你使用关系代数方法来处理max属性问题。查看(How can I find MAX with relational algebra?)或谷歌

首先,此查询将帮助您找出最高薪水

select sal from emp b where a.sal <= b.sal

其次,内部聚合函数是计算最高工资的发生次数

count(distinct sal)

最后,3&gt; =基本上是检查最大工资是否超过三次。因此,如果该表的雇员人数少于三人,并且没有找到任何结果。

3>= (select count(distinct sal) from emp b where a.sal <= b.sal) ;

答案 3 :(得分:0)

更好的选择:

SELECT sal
FROM  (SELECT sal,RANK() OVER (ORDER BY sal DESC) r FROM stats)
WHERE R <= 3

答案 4 :(得分:0)

使用ROW_NUMBER函数的另一个选项:

SELECT * FROM TABLE_NAME QUALIFY ROW_NUMBER OVER(ORDER BY SAL DESC) <=3

答案 5 :(得分:0)

---找到2个最大声明的emp细节

select * from emp_data a
where 2 >= (select COUNT(distinct sal)
            from emp_data b
            where a.sal <= b.sal) 

非常简单且最容易

答案 6 :(得分:0)

最简单的方法是这样的:

select distinct salary from employees order by salary desc LIMIT 3;

以上陈述是针对薪水的“ N ”。

如果您需要雇员的薪水从n1_maximum到n2_maximum ,则可以使用以下查询。

select distinct salary from employees order by salary desc LIMIT 3 OFFSET 4;