【问题标题】:"line fusion" in oracleoracle中的“线融合”
【发布时间】:2012-02-02 13:24:19
【问题描述】:

我正在尝试在 Oracle 中进行“行融合”,即我想要一个返回行的查询,并且这些行中的每一行对于每一列都有最初存储在其他行中的值。

例如(我关注documentation),假设我有一个员工表EMP 存储员工编号、部门编号和工资

如何创建一个查询,该查询返回与部门一样多的行,并返回该部门的最高工资?

我想要这样的东西:

 EMPNO     DEPTNO        SAL MAX_VAL_IN_DEPT
---------- ---------- ---------- -----------------
  7934         10       1300              1300
  7369         20        800               800
  7900         30        950               950

This query:

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 子句。

【问题讨论】:

    标签: sql oracle group-by grouping analytic-functions


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案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;
      

      【讨论】:

        【解决方案3】:

        可能类似于(未经测试):

        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
        ;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-05-04
          • 1970-01-01
          • 2012-04-22
          • 1970-01-01
          • 1970-01-01
          • 2022-12-23
          • 2011-06-20
          • 1970-01-01
          相关资源
          最近更新 更多