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() 也是解析函数吗??
这是一种痛苦,但你可以做到。以下查询获得第二高的薪水:
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)
创建表并插入虚拟数据
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)