name salary
----- -----
mohan 500
ram 1000
dinesh 5000
hareesh 6000
mallu 7500
manju 7500
praveen 10000
hari 10000
如何使用Oracle从上述表中找到第n个最高工资?
答案 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个最高薪水
你可以在屏幕截图中看到它正在工作。
答案 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)迭代结果集
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
从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。
答案 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
答案 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
,但是即使有两个或两个以上雇员的薪水相同,它也只选择一条记录或最高薪水的行。