从表中找出第 n 高的薪水

Posted

技术标签:

【中文标题】从表中找出第 n 高的薪水【英文标题】:Find out the nth-highest salary from table 【发布时间】:2013-08-17 06:35:59 【问题描述】:
name   salary
-----   -----
mohan     500
ram      1000
dinesh   5000
hareesh  6000
mallu    7500
manju    7500
praveen 10000
hari    10000

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

【问题讨论】:

使用 RANK 或 DENSE_RANK,哪个更适合您的情况。 【参考方案1】:
select * 
  from ( select s.*, rank() over (order by salary desc) as rownumber
           from salary )
 where rownumber = nth

用你的工资号代替“nth”

【讨论】:

select * from (select rank() over(order by Salary DESC) as rownumber,* from second_salary) SalaryRank where rownumber = 3 我试试上面提到的查询 你的工资栏的数据类型是什么 它应该可以工作。尝试使用其他数字数据类型,例如 int float decimal ...缺少表达式意味着您缺少逗号或括号。 你错过了一个点@kuldeep......你可能还应该使用 ROW_NUMBER() 代替,如果出现平局,rank() 将提供相同的值。【参考方案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个最高薪水

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

【讨论】:

可以看到这个解决方案是针对oracle的。对于 sql 会有很大的不同... 抱歉,但看到了这个......sqlfiddle.com/#!4/ef767/18这与我在答案中发布的完全相同......它工作正常...... 也在您的链接中...第三高的是 10000 而不是 5000,因为有一个 20000 的 hari2,然后是 13000 的 hari1...请自行查看.. +1 我明白了 Gaurav。您的解决方案是正确的。错误是对 Order By to take 的误解。 不用担心...我只是希望其他认为此答案正确且有帮助的人...投赞成票...【参考方案3】:
select * from 
(
    select sal, rank() over (order by sal DESC/ASC) rnk 
    from emp
) 
where rnk = 1/2/3/4/5/6/...;

【讨论】:

【参考方案4】:

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

解决方案 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 的薪水。


解决方案 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;

【讨论】:

【参考方案5】:

一般查询所有数据库

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 )

任何编程语言

按工资从雇员订单中选择 *

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

Mysql

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

【讨论】:

【参考方案6】:

您已标记您的问题 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

【讨论】:

select sal, ename, nth_value(sal, 3) over() from scott.emp 不给出正确的结果,除非它被命令 select sal, ename, nth_value(sal, 3) over() from sal 的 scott.emp 订单 从 scott.emp 中选择 sal, ename, nth_value(sal, 3) over() 这也有效【参考方案7】:

声明完好; SET M=N-1; 从员工中选择不同的薪水 ORDER BY Salary DESC LIMIT M,1;

【讨论】:

【参考方案8】:

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

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

【讨论】:

我错过了最后一个“)”。现在就试试吧。【参考方案9】:

用简单的方法选出第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 个数字.....

【讨论】:

【参考方案10】:

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

【讨论】:

在这个线程中提到了 2 次,并附有 mysql 的说明。不幸的是,Oracle 没有像 LIMIT 这样的运算符。【参考方案11】:

在 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;

例如查找第三低的薪水(按“升序”进行排序):

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

【讨论】:

【参考方案12】:

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

 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)

Look here

【讨论】:

【参考方案13】:

在 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)

干杯!

【讨论】:

【参考方案14】:

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

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

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

【讨论】:

【参考方案15】:

从emp_table order by Salary desc limit n-1,1中选择不同的薪水;

【讨论】:

【参考方案16】:
SELECT * FROM (SELECT SALARY, DENSE_RANK() OVER ( ORDER BY SALARY DESC) nth_salary FROM EMPLOYEES)WHERE nth_salary = 1;

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

【讨论】:

以上是关于从表中找出第 n 高的薪水的主要内容,如果未能解决你的问题,请参考以下文章

177. 第N高的薪水

177. 第N高的薪水

力扣——第N高的薪水(数据库的题

Leetcode No.177 第N高的薪水

第二高的薪水 | MySQL

⭐️ LeetCode解题系列 ⭐️ 177. 第N高的薪水(Oracle dense_rank函数)