是否有任何预定义的函数或方法可用于从员工表中获得第二高薪?
答案 0 :(得分:5)
这样做的方法是使用Oracle的Analytic函数。您的特定情况只是我在another thread中提供的解决方案的变体。
如果您只想选择第二高薪,那么DENSE_RANK(),RANK()和ROW_NUMBER()中的任何一个都可以解决这个问题:
SQL> select * from
2 ( select sal
3 , rank() over (order by sal desc) as rnk
4 from
5 ( select distinct sal
6 from emp )
7 )
8 where rnk = 2
9 /
SAL RNK
---------- ----------
3000 2
SQL>
但是,如果要选择其他信息,例如薪水第二高的员工姓名,您选择的功能将影响结果。选择一个而不是另一个的主要原因是当出现平局时会发生什么。
如果您使用ROW_NUMBER(),它将返回按工资排序的第二名员工:如果有两名员工争夺最高薪水怎么办?如果有两名员工争夺第二高薪怎么办? Wheareas如果您使用RANK()并且有两名员工争夺第一个最高薪水,那么RANK = 2将会有 no 记录。
我建议在这些情况下,DENSE_RANK()通常是最安全的选择,但它确实取决于具体的业务需求。
答案 1 :(得分:2)
在Oracle中,您将使用此类查询返回分页结果(行M到N):
SELECT NAME, salary
FROM (SELECT NAME, salary, ROWNUM r
FROM (SELECT NAME, salary
FROM employee
ORDER BY salary DESC
)
WHERE ROWNUM <= :N
)
WHERE r >= :M
或者,您可以使用分析:
SELECT NAME, salary
FROM (SELECT NAME, salary, row_number() over (ORDER BY salary DESC) n
FROM employee)
WHERE n BETWEEN :M AND :N
答案 2 :(得分:1)
如果您想从表中找到n个最高工资,可以使用:
select min(sal)from (select distinct sal from emp order by sal desc) where rownum<=n;
其中n是1,2,3,...,n
从表格中找出最高工资是一个非常简单的过程。
答案 3 :(得分:0)
试试这个:
SELECT * FROM employee emp WHERE 2=(SELECT COUNT(*) FROM employee WHERE
salary >= emp.salary);
答案 4 :(得分:0)
使用Top-N
处理Oracle DB 12c
查询会更容易,该查询引入了这样的语法:
[ OFFSET offset { ROW | ROWS } ]
[ FETCH { FIRST | NEXT } [ { rowcount | percent PERCENT } ]
{ ROW | ROWS } { ONLY | WITH TIES } ]
在ORDER BY
列表之后的查询中使用。
在这种情况下,请考虑使用:
select *
from emp
order by sal desc
offset 1 rows fetch next 1 rows only
从语法上可以看出,在offset
中使用fetch
是可选的,并指出offset + 1
子句的起点是ties
。
一种特殊情况是使用only
,这意味着多行与第N行的值匹配(这里我们需要第2行)。如果排名第一的职位有不只一个薪水相同的人,那么我们需要将with ties
替换为select *
from emp
order by sal desc
offset 1 rows fetch next 1 rows with ties
关键字,以将他们全部退还:
add_edge