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

sqyvllje  于 2023-11-17  发布在  Oracle
关注(0)|答案(8)|浏览(206)

有谁能解释一下下面关于获得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) ;


有谁能解释一下吗?如果有其他方法可以得到相同的结果,请咨询我的查询

kqhtkvqz

kqhtkvqz1#

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;

字符串
这个查询从外部查询(即empa)获取所有记录,并逐个迭代它们,将值传递给内部查询。
让我们举一个例子:
1.它获取第一行,即1, 300,并将此值传递给内部查询
1.内部查询尝试查找小于或等于empb中记录的非重复sal
1.计数为3,因为50200150小于300。由于3 >= 3(内部查询结果),答案为true,并选择300
1.现在外部循环计数器到达第二行,即2, 50。它将值传递给内部查询,在这种情况下,count不满足3 >=条件,因此50未被选中。
1.现在400,在这种情况下,内部查询返回4,因此它满足条件,因此选择400
1.现在200,在本例中,内部查询返回3,因此也选择了它
1.现在150,在本例中,内部查询返回2,因此这已被过滤掉
1.因此,结果将是400300200被选中。

jexiocij

jexiocij2#

这是一种奇怪的方法,但它会工作。基本上,对于表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

rdlzhqv9

rdlzhqv93#

基本上,你的朋友建议你用关系代数的方法来处理最大属性问题。
首先,这个查询将帮助您找出最高工资

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

字符串
其次,内部聚合函数是统计最高工资发生的次数

count(distinct sal)


最后,3>=基本上是检查最高工资是否出现了三次以上。因此,如果表中有少于三个员工都有最高工资,则不会找到结果。

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

webghufk

webghufk4#

更好的选择:

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

字符串

b4lqfgs4

b4lqfgs45#

另一个选项使用ROW_NUMBER函数:

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

字符串

hgb9j2n6

hgb9j2n66#

  • 查找2 max salarised emp详细信息
select * from emp_data a
where 2 >= (select COUNT(distinct sal)
            from emp_data b
            where a.sal <= b.sal)

字符串
非常简单,

mwyxok5s

mwyxok5s7#

最简单的方法是这样的:
第一个月
以上报表针对工资“N”执行。
如果您需要员工的工资在n1_maximum到n2_maximum之间,则可以使用以下查询。
select distinct salary from employees order by salary desc LIMIT 3 OFFSET 4;

bn31dyow

bn31dyow8#

--编写一个SQL查询,从一个表中获取三个最大工资。

select
    *
from
    tablename
order by
    SALARY desc
LIMIT 3;

字符串

相关问题