我正在尝试在Oracle中进行"行融合",即我希望有一个返回行的查询,而这些行中的每一行对于每一列都有最初存储在其他行中的值。
例如(我遵循文档),假设我有一个员工表EMP
,存储员工编号、部门编号和工资
如何创建一个查询,返回与部门一样多的行,并返回该部门的最高工资?
我想要这样的东西:
EMPNO DEPTNO SAL MAX_VAL_IN_DEPT
---------- ---------- ---------- -----------------
7934 10 1300 1300
7369 20 800 800
7900 30 950 950
此查询:
SELECT empno
, deptno
, sal
, FIRST_VALUE(sal IGNORE NULLS) OVER (PARTITION BY deptno ORDER BY sal ASC NULLS LAST) AS first_val_in_dept
FROM emp;
是我能找到的最接近的,但我需要一个无法添加的额外GROUP BY
deptno子句。
这将比具有单独子选择的版本更快。
你的陈述很接近,你只需要使用max()
:
select empno,
deptno,
sal,
max(sal) over (partition by deptno) as MAX_VAL_IN_DEPT
from emp
不过,不确定您的"行数与部门数一样多"语句。您的样本输出清楚地显示了每个员工一条"线",而不是部门。
这样做:
SELECT e.empno
, e.deptno
, e.sal
, e2.maxsal AS MAX_VAL_IN_DEPT
FROM emp e
INNER JOIN (select t.deptno, max(sal) as maxsal from emp t group by t.deptno) e2 on e.deptno = e2.deptno;
也许类似(未经测试):
select
e.empno,
e.deptno,
e.sal,
d.max_sal
from emp e,
(
select deptno, max(sal) as max_sal
from dept
group by deptno
) d
where e.deptno = d.deptno
;