Oracle中的第N个最高工资

Sai*_*Sai 2 sql oracle oracle11g

为了找出oracle中的第N个最大值,我使用下面的查询

SELECT DISTINCE sal 
FROM emp a 
WHERE (
       SELECT COUNT(DISTINCE sal) 
       FROM emp b 
       WHERE a.sal<=b.sal)=&n;
Run Code Online (Sandbox Code Playgroud)
  • 但据我说,使用上面的查询,如果表大小很大,将需要更多的时间来执行.

  • 我正在尝试使用以下查询

    SELECT sal 
    FROM (
          SELECT DISTINCE sal 
          FROM emp 
               ORDER BY sal DESC ) 
    WHERE rownum=3;
    
    Run Code Online (Sandbox Code Playgroud)
  • 但没有得到输出..任何建议请..请分享任何关于如何优化查询和减少查询执行时间的链接.

vha*_*lgi 20

试试这个

select *
  from
  (
    select
        sal
          ,dense_rank() over (order by sal desc) ranking
    from   table
  )
  where ranking = 4 -- Replace 4 with any value of N
Run Code Online (Sandbox Code Playgroud)

  • 如果两个人有相同的薪水,他们必须给出相同的等级,所以在这种情况下必须使用 `dense_rank` (2认同)

Kom*_*owy 6

SELECT sal FROM (
    SELECT sal, row_number() OVER (order by sal desc) AS rn FROM emp
)
WHERE rn = 3
Run Code Online (Sandbox Code Playgroud)

是的,如果表很大,执行时间会更长。但是对于“第 N 行”查询,唯一的方法是查看所有数据并对其进行排序。如果你有sal的索引,它肯定会快得多。

  • 您需要在 order by 上使用 `desc`,并且由于 OP 需要不同的工资,按工资分组对于非重复排名工资很有用。 (2认同)
  • 对于此特定要求,请务必注意 `row_number`、`rank` 和 `dense_rank` 之间的差异。当你有一个以上工资相同的人时,会发生什么?你应该把它们算在同一个位置吗……? (2认同)

小智 5

SELECT * 
FROM Employee Emp1
WHERE (N-1) = ( 
SELECT COUNT(DISTINCT(Emp2.Salary))
FROM Employee Emp2
WHERE Emp2.Salary > Emp1.Salary)
Run Code Online (Sandbox Code Playgroud)