对employ表的sql查询
“我的员工”表有3列: emp_id, 皇帝, 部门id。 我需要为每个部门找到薪水最高的员工。我需要返回这些员工的emp\u id、emp\u sal和dept\u id 提前感谢ORACLE支持常用的表表达式和窗口功能对employ表的sql查询,sql,oracle,top-n,dense-rank,Sql,Oracle,Top N,Dense Rank,“我的员工”表有3列: emp_id, 皇帝, 部门id。 我需要为每个部门找到薪水最高的员工。我需要返回这些员工的emp\u id、emp\u sal和dept\u id 提前感谢ORACLE支持常用的表表达式和窗口功能 WITH employees_sal AS ( SELECT emp_id, emp_sal, dept_id, DENSE_RANK() OVER(PARTITION BY dept_id O
WITH employees_sal
AS
(
SELECT emp_id,
emp_sal,
dept_id,
DENSE_RANK() OVER(PARTITION BY dept_id ORDER BY emp_sal DESC) ranks
FROM employee
)
SELECT emp_id, emp_sal, dept_id
FROM employees_sal
WHERE ranks = 1
没有必要使用CTE
SELECT a.emp_id, a.emp_sal, a.dept_id
FROM employ a
WHERE a.emp_sal =
(SELECT MAX(b.emp_sal)
FROM employ b
WHERE b.dept_id = a.dept_id
AND A.emp_id = B.emp_id)
@Aspirant-您确定这是有效的Oracle语法吗?同样,也不需要使用相关子查询。两种方法都很好。从提问者的声誉来看,我只是想用一些他们可能比学习CTE更容易理解的方法。此查询是Oracle DB for PeopleSoft中的常见做法,因此很可能会在您与之交互的其他代码中看到。此查询将返回薪资与最高部门薪资匹配的员工。它不返回每个部门工资最高的员工。打得好,我挂断了电话。这与我每天使用的代码非常相似。
SELECT EMP_ID,EMP_SAL,DEPT_ID
FROM EMP
WHERE (DEPT_ID,EMP_SAL) IN (SELECT DEPT_ID,MAX(EMP_SAL)
FROM EMP GROUP BY DEPT_ID)
SELECT * FROM
(
SELECT deptno, ename, sal
, MAX(sal) OVER (PARTITION BY deptno) dept_max_sal
, ROW_NUMBER() OVER (PARTITION BY deptno ORDER BY sal desc) rno
FROM scott.emp
)
WHERE sal = dept_max_sal
-- AND rno = 1 -- Optional to eliminate same salary employee --
ORDER BY deptno, sal DESC, ename
/
DEPTNO ENAME SAL DEPT_MAX_SAL RNO
-----------------------------------------------
10 KING 5000 5000 1
20 FORD 3000 3000 2 -- same sal --
20 SCOTT 3000 3000 1 -- same sal --
30 BLAKE 2850 2850 1