name salary
----- -----
mohan 500
ram 1000
dinesh 5000
hareesh 6000
mallu 7500
manju 7500
praveen 10000
hari 10000
我如何使用 Oracle 从上述表格中找到第 n 高的薪水?
name salary
----- -----
mohan 500
ram 1000
dinesh 5000
hareesh 6000
mallu 7500
manju 7500
praveen 10000
hari 10000
我如何使用 Oracle 从上述表格中找到第 n 高的薪水?
select *
from ( select s.*, rank() over (order by salary desc) as rownumber
from salary )
where rownumber = nth
通过你的工资号码代替“nth”
你可以使用这样的东西..这是我测试过的,然后粘贴在这里
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 最高薪水
您可以在屏幕截图中看到它正在工作。
select * from
(
select sal, rank() over (order by sal DESC/ASC) rnk
from emp
)
where rnk = 1/2/3/4/5/6/...;
本文深入探讨了这个问题,我将在下面引用它的代码:(注: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;
所有数据库的 通用查询
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)迭代结果集
SELECT DISTINCT salary FROM emp X order by salary desc limit n,1
您已经标记了您的问题 Oracle,因此您可以使用该NTH_VALUE()
功能......不幸的是,它是一个分析功能,但您的查询将简化为:
select distinct nth_value(salary, 3) over ()
from employees
从 12c 开始,Oracle 终于赶上了世界其他地方,并包含了 OFFSET,因此您可以改用它:
select salary
from employees
order by salary
offset n - 1
fetch next row only
声明完好;SET M=N-1;SELECT DISTINCT Salary FROM Employee ORDER BY Salary DESC LIMIT M,1;
你可以在谷歌上找到很多东西
select *
from table_name T1
where Nth = (select count(distinct (T2.sal))
from table_name T2
where T1.sal <= T2.sal )
用简单的方法选择第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个数字.....
请参阅以下查询以获得第 n 高的薪水。通过这种方式,您可以获得第 n 高的薪水。如果您只想获得第 n 个最低工资,则需要在查询中将 DESC 替换为 ASC。
在 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;
在 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)
在 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)
干杯!
我们可以通过相关子查询来做到这一点。
SELECT Salary
FROM Employee E1
WHERE N-1 = (SELECT COUNT(*)
FROM Employee E2
WHERE E1.salary <E2.Salary)
如需更多知识,请查看此链接。 相关子查询与示例
从emp_table order中选择不同的薪水,按薪水降序限制n-1,1;
SELECT * FROM (SELECT SALARY, DENSE_RANK() OVER ( ORDER BY SALARY DESC) nth_salary FROM EMPLOYEES)WHERE nth_salary = 1;
它在 Oracle 中几乎可以工作。您可以改用ROW_NUMBER()
函数,DENSE_RANK
但即使有两个或多个员工的薪水相同,它也只会选择一条记录或行作为最高薪水。