"line fusion"在甲骨文中



我正在尝试在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
;

相关内容

  • 没有找到相关文章

最新更新