从表中找出第n个最高薪水

时间:2013-08-17 06:36:00

标签: sql oracle11g greatest-n-per-group

name   salary
-----   -----
mohan     500
ram      1000
dinesh   5000
hareesh  6000
mallu    7500
manju    7500
praveen 10000
hari    10000

如何使用Oracle从上述表中找到第n个最高工资?

16 个答案:

答案 0 :(得分:4)

select * 
  from ( select s.*, rank() over (order by salary desc) as rownumber
           from salary )
 where rownumber = nth

通过你的工资号码代替“nth”

答案 1 :(得分:3)

select * from 
(
    select sal, rank() over (order by sal DESC/ASC) rnk 
    from emp
) 
where rnk = 1/2/3/4/5/6/...;

答案 2 :(得分:2)

你可以使用这样的东西..这是我测试过的,然后粘贴在这里

SELECT *
FROM   tblname
WHERE  salary = (SELECT *
                 FROM   (SELECT *
                         FROM   (SELECT *
                                 FROM   (SELECT DISTINCT( salary )
                                         FROM   tblname
                                         ORDER  BY salary DESC) A
                                 WHERE  rownum <= nth) B
                         ORDER  BY salary ASC) C
                 WHERE  rownum <= 1) 

代替'tblname'提供您的表名,然后 nth 给出您想要的第n个最高薪水

enter image description here

你可以在屏幕截图中看到它正在工作。

答案 3 :(得分:2)

This article深入讨论这个问题,我将在下面引用它的代码:(注意:请参阅Oracle的底部2个解决方案)

解决方案1:这个SQL找到第N个最高工资应该适用于SQL Server,MySQL,DB2,Oracle,Teradata以及几乎任何其他RDBMS :(注意:由于子查询而性能较低)

SELECT * /*This is the outer query part */
FROM Employee Emp1
WHERE (N-1) = ( /* Subquery starts here */
SELECT COUNT(DISTINCT(Emp2.Salary))
FROM Employee Emp2
WHERE Emp2.Salary > Emp1.Salary)

在上面的查询中要理解的最重要的事情是,每次外部查询处理行时,都会对子查询进行求值。换句话说,内部查询不能独立于外部查询进行处理,因为内部查询也使用Emp1值。

为了找到第N个最高工资,我们只找到N-1工资大于其自身的工资。


解决方案2:使用SQL Server中的TOP关键字查找第n个最高薪水

SELECT TOP 1 Salary
FROM (
      SELECT DISTINCT TOP N Salary
      FROM Employee
      ORDER BY Salary DESC
      ) AS Emp
ORDER BY Salary

解决方案3:在不使用TOP

的情况下,在SQL Server中找到第n个最高薪水
SELECT Salary FROM Employee 
ORDER BY Salary DESC OFFSET N-1 ROW(S) 
FETCH FIRST ROW ONLY

请注意,我没有亲自测试上面的SQL,我相信它只能在SQL Server 2012及更高版本中运行。


解决方案4:在MySQL中运行

SELECT Salary FROM Employee 
ORDER BY Salary DESC LIMIT n-1,1

LIMIT子句在该查询中接受两个参数 - 第一个参数指定要返回的第一行的偏移量,第二个参数指定要返回的最大行数。


解决方案5:适用于Oracle

select * from (
  select Emp.*, 
row_number() over (order by Salary DESC) rownumb 
from Employee Emp
)
where rownumb = n;  /*n is nth highest salary*/

解决方案6:以Oracle方式2工作

select * FROM (
select EmployeeID, Salary
,rank() over (order by Salary DESC) ranking
from Employee
)
WHERE ranking = N;

答案 4 :(得分:1)

所有数据库的

常规查询

SELECT DISTINCT salary FROM emp X WHERE n = 
    ( SELECT COUNT(DISTINCT salary) FROM emp WHERE salary >=X.salary )

用给定的数字替换n。 例如,获得第三高薪

SELECT DISTINCT salary FROM emp X WHERE 3 = 
( SELECT COUNT(DISTINCT salary) FROM emp WHERE salary >=X.salary )

OR

任何编程语言

按薪水选择*来自emp订单

然后用编程语言(JAVA,.net或php)迭代结果集

Mysql的

SELECT DISTINCT salary FROM emp X order by salary desc limit n,1

答案 5 :(得分:1)

您已将问题标记为Oracle,因此您可以使用NTH_VALUE()函数...遗憾的是,它是一个分析函数,但您的查询将简化为:

select distinct nth_value(salary, 3) over ()
  from employees 

SQL Fiddle

从12c开始Oracle终于赶上了世界其他地方,并且包括OFFSET,所以你可以使用它来代替:

select salary
  from employees
 order by salary
offset n - 1
 fetch next row only

答案 6 :(得分:1)

DECLARE M INT; SET M = N-1; 从员工中选择DISTINCT薪水 ORDER BY Salary DESC LIMIT M,1;

答案 7 :(得分:0)

你可以在Google上找到很多东西

select * 
  from table_name T1 
 where Nth = (select count(distinct (T2.sal)) 
                from table_name T2 
               where T1.sal <= T2.sal )

答案 8 :(得分:0)

以简单的方式选择第n个最高薪水

SELECT emp_no, sal
FROM
(
select emp_no, sal, ROW_NUMBER() OVER (order by sal desc) RN 
from emp 
order by sal desc
)
WHERE RN = n;

其中n =您想要的第n个数字.....

答案 9 :(得分:0)

请参阅以下查询以获得第n个最高薪水。通过这种方式,你获得第n个最高薪水。如果你想获得第n个最低工资,你需要在查询中用ASC替换DESC。 for getting nth highest salry

答案 10 :(得分:0)

在MySql中,运行以下SQL以找到第n个最高薪水:

SELECT distinct(salary), emp_id, name 
       FROM `emp_salary` 
       group by salary 
       order by salary desc limit N-1,1;

例如找到第三高薪:

SELECT distinct(salary), emp_id, name 
       FROM `emp_salary` 
       group by salary 
       order by salary desc limit 2,1;

例如,找到第3个最低工资(按&#34;按asc&#34排序):

SELECT distinct(salary), emp_id, name 
       FROM `emp_salary` 
       group by salary 
       order by salary asc limit 2,1;

答案 11 :(得分:0)

在Sql server 2012及更高版本中。请参阅此链接了解Fetch, Offset, Sql server Page

$ node-debug -p 8082 try-debug.js 8081

Look here

答案 12 :(得分:0)

在Oracle中尝试以下内容:

SELECT *
FROM
  (SELECT rownum AS rn,
    a.*
  FROM
    (WITH DATA AS -- creating dummy data
    ( SELECT 'MOHAN' AS NAME, 200 AS SALARY FROM DUAL
    UNION ALL
    SELECT 'AKSHAY' AS NAME, 500 AS SALARY FROM DUAL
    UNION ALL
    SELECT 'HARI' AS NAME, 300 AS SALARY FROM DUAL
    UNION ALL
    SELECT 'RAM' AS NAME, 400 AS SALARY FROM DUAL
    )
  SELECT D.* FROM DATA D ORDER BY SALARY DESC
    ) A
  )
WHERE rn = 3; -- specify N'th highest here (In this case fetching 3'rd highest)

干杯!

答案 13 :(得分:0)

我们可以通过相关子查询来做到这一点。

SELECT Salary
FROM Employee E1
WHERE N-1 = (SELECT COUNT(*)
         FROM Employee E2
         WHERE E1.salary <E2.Salary) 

如需进一步了解,请查看此链接.. Correlated Subquery with example

答案 14 :(得分:0)

从emp_table顺序中按薪水降序限制n-1,1选择不同的薪水;

答案 15 :(得分:0)

SELECT * FROM (SELECT SALARY, DENSE_RANK() OVER ( ORDER BY SALARY DESC) nth_salary FROM EMPLOYEES)WHERE nth_salary = 1;

在Oracle中几乎可以使用。您可以使用ROW_NUMBER()函数来代替DENSE_RANK,但是即使有两个或两个以上雇员的薪水相同,它也只选择一条记录或最高薪水的行。