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

我如何使用 Oracle 从上述表格中找到第 n 高的薪水?

4

16 回答 16

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

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

于 2013-08-17T06:47:10.307 回答
3

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

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给出你想要的 nth 最高薪水

在此处输入图像描述

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

于 2013-08-17T07:12:29.060 回答
3
select * from 
(
    select sal, rank() over (order by sal DESC/ASC) rnk 
    from emp
) 
where rnk = 1/2/3/4/5/6/...;
于 2014-02-24T09:04:17.803 回答
2

本文深入探讨了这个问题,我将在下面引用它的代码:(注:Oracle 见底部 2 个解决方案)

解决方案 1:这个查找第 N 高薪的 SQL 应该适用于 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 的薪水。


解决方案二:在 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;
于 2014-02-05T18:26:43.523 回答
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 )

或者

任何编程语言

select * from emp order by 薪水

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

mysql

SELECT DISTINCT salary FROM emp X order by salary desc limit n,1
于 2013-08-17T09:32:53.187 回答
1

您已经标记了您的问题 Oracle,因此您可以使用该NTH_VALUE()功能......不幸的是,它是一个分析功能,但您的查询将简化为:

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

SQL小提琴

从 12c 开始,Oracle 终于赶上了世界其他地方,并包含了 OFFSET,因此您可以改用它:

select salary
  from employees
 order by salary
offset n - 1
 fetch next row only
于 2013-08-17T10:59:48.310 回答
1

声明完好;SET M=N-1;SELECT DISTINCT Salary FROM Employee ORDER BY Salary DESC LIMIT M,1;

于 2015-01-14T09:15:07.290 回答
0

你可以在谷歌上找到很多东西

select * 
  from table_name T1 
 where Nth = (select count(distinct (T2.sal)) 
                from table_name T2 
               where T1.sal <= T2.sal )
于 2013-08-17T06:42:18.220 回答
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个数字.....

于 2013-11-22T12:53:58.297 回答
0

请参阅以下查询以获得第 n 高的薪水。通过这种方式,您可以获得第 n 高的薪水。如果您只想获得第 n 个最低工资,则需要在查询中将 DESC 替换为 ASC。 获得第 n 高的薪水

于 2014-11-28T08:40:24.407 回答
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;

例如,查找第三低的薪水(“按 asc 排序”):

SELECT distinct(salary), emp_id, name 
       FROM `emp_salary` 
       group by salary 
       order by salary asc limit 2,1;
于 2015-05-05T19:10:15.877 回答
0

在 Sql server 2012 及更高版本中。请参考此链接获取 Fetch、Offset、Sql server 页面

 Use AdventureWorks /* AdventureWorks 2014 DB*/

Select distinct(CommissionPct) from Sales.SalesPerson
order by CommissionPct desc OffSet 3 Rows Fetch next 1 Rows only

--This for 4Th highest value (N-1)

看这里

于 2015-12-06T07:33:51.460 回答
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)

干杯!

于 2016-10-19T04:00:39.977 回答
0

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

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

如需更多知识,请查看此链接。 相关子查询与示例

于 2017-04-11T05:31:16.060 回答
0

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

于 2018-07-03T05:34:36.213 回答
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但即使有两个或多个员工的薪水相同,它也只会选择一条记录或行作为最高薪水。

于 2018-12-06T04:49:14.590 回答