0

我正在尝试在 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 子句。

4

3 回答 3

2

像这样做:

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;
于 2012-02-02T13:50:10.333 回答
2

也许像(未经测试):

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
;
于 2012-02-02T14:00:35.350 回答
2

这将比具有单独子选择的版本更快。

您的陈述很接近,您只需要使用max()

select empno,  
       deptno,
       sal,
       max(sal) over (partition by deptno) as MAX_VAL_IN_DEPT
from emp 

不过,不确定您的“与部门一样多的行”声明。您的示例输出清楚地显示了每个员工而不是部门的一条“线”。

于 2012-02-02T14:28:21.680 回答