找到第二高薪

use*_*901 3 sql oracle

那是一个众所周知的问题.考虑以下

EmployeeID  EmployeeName    Department      Salary   
----------- --------------- --------------- ---------
1           T Cook          Finance         40000.00
2           D Michael       Finance         25000.00
3           A Smith         Finance         25000.00
4           D Adams         Finance         15000.00
5           M Williams      IT              80000.00
6           D Jones         IT              40000.00
7           J Miller        IT              50000.00
8           L Lewis         IT              50000.00
9           A Anderson      Back-Office     25000.00
10          S Martin        Back-Office     15000.00
11          J Garcia        Back-Office     15000.00
12          T Clerk         Back-Office     10000.00
Run Code Online (Sandbox Code Playgroud)

我们需要找出第二高的薪水

With Cte As
(
  Select 
    level
    ,Department
    ,Max(Salary) 
 From plc2_employees
 Where level = 2
 Connect By Prior (Salary) > Salary)
Group By level,Department
)

Select 
    Employeeid
    ,EmployeeName
    ,Department
    ,Salary
From plc2_employees e1
Inner Join Cte e2 On e1.Department = e2.Department
Order By 
    e1.Department
    , e1.Salary desc
    ,e1.EmployeeID
Run Code Online (Sandbox Code Playgroud)

某种程度上不起作用......我没有得到正确的结果.有人可以帮帮我吗.

Gre*_*lds 7

就像是

select * from
(
select EmployeeID, EmployeeName, Department, Salary, 
rank () over (partition by Department order by Salary desc) r
from PLC2_Employees
)
where r = 2
Run Code Online (Sandbox Code Playgroud)

编辑 - 测试它,它给出了你期望的答案.


DCo*_*kie 6

如果您要自学如何处理CONNECT BY,您应该首先找到适合构造的问题.CONNECT BY用于处理分层形式的数据,而您的示例则不是.工资以分层方式彼此无关.试图在错误的问题上强制构建一个构造是令人沮丧的,并没有真正教你任何东西.

查看可以与Oracle一起安装的演示HR模式中的经典员工 - 经理关系.所有员工都向经理报告,包括经理(除了顶级人员).然后,您可以使用此架构创建查询,以显示公司的组织结构图.