如何在不使用分析功能的情况下明智地获得第二高薪部门?

san*_*ddy 6 sql oracle greatest-n-per-group

假设我们每个部门有 3 名员工。我们总共有 3 个部门。下面是示例源表

Emp deptno salary
A    10     1000
B    10     2000
C    10     3000
D    20     7000
E    20     9000
F    20     8000
G    30     17000
H    30     15000
I    30     30000
Run Code Online (Sandbox Code Playgroud)

输出

B    10     2000
F    20     8000
G    30     17000
Run Code Online (Sandbox Code Playgroud)

通过使用分析函数dense_rank,我们可以达到第二高的工资部门。

我们可以在不使用任何分析函数的情况下实现这一点吗???

Max() 也是解析函数吗??

Gor*_*off 8

这是一种痛苦,但你可以做到。以下查询获得第二高的薪水:

select t.deptno, max(t.salary) as maxs
from table t
where t.salary < (select max(salary)
                  from table t2
                  where t2.deptno = t.deptno
                 )
group by t.deptno;
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用它来获取员工:

select t.*
from table t join
     (select t.deptno, max(t.salary) as maxs
      from table t
      where t.salary < (select max(salary)
                        from table t2
                        where t2.deptno = t.deptno
                       )
      group by t.deptno
     ) tt
     on t.deptno = tt.deptno and t.salary = tt.maxs;
Run Code Online (Sandbox Code Playgroud)


Ash*_*kla 5

创建表并插入虚拟数据

CREATE TABLE #Employee
(
 Id Int,
 Name NVARCHAR(10), 
 Sal int, 
 deptId int
)


INSERT INTO #Employee VALUES
(1, 'Ashish',1000,1),
(2,'Gayle',3000,1),
(3, 'Salman',2000,2),
(4,'Prem',44000,2)
Run Code Online (Sandbox Code Playgroud)

查询得到结果

 ;WITH cteRowNum AS (
SELECT *,
       DENSE_RANK() OVER(PARTITION BY deptId ORDER BY Sal DESC) AS RowNum
    FROM #Employee
 )
 SELECT *
 FROM cteRowNum
 WHERE RowNum = 2;
Run Code Online (Sandbox Code Playgroud)