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

これは、個別の副選択があるバージョンよりも高速になります。

あなたの声明は近かった、あなたはただ使う必要があるmax()

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

ただし、「部門と同じ数の行」のステートメントについてはよくわかりません。サンプル出力は、部門ではなく、従業員ごとに1つの「行」を明確に示しています。

于 2012-02-02T14:28:21.680 に答える
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

次のようにします。

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 に答える