2016-10-11 2 views

答えて

2

あなたは非標準のOracle機能を使用しています。サブクエリのデータには元々注文はありませんが、Oracleでは後でROWNUM基準を適用できるように注文することができます。 ROWNUMもOracle固有のものです。

さらに、同じ給与を持つ複数の従業員がいる場合があります。そこでは、それらをすべて表示するのではなく、任意に選択します。ここで

は、標準SQLでavarageに最も近い給与と従業員(複数可)を選択する方法である:

select * 
from emp 
order by abs(sal - avg(sal) over()) 
fetch first row with ties; 

この最後の行は、Oracle 12cのとして利用可能です。古いバージョンでは

(つまりは、Oracle 9iの、10Iまたは11gである)あなたの代わりにあなたの行をランク付けしたい:

select empno, ename, sal 
from 
(
    select empno, ename, sal, rank() over (order by diff) as rnk 
    from 
    (
    select emp.*, abs(sal - avg(sal) over()) as diff 
    from emp 
) evaluated 
) ranked 
where rnk = 1; 
+1

こんにちは、私の12Cデータベースと、句を制限するあなたの行はエラーをスローします。あなたの節を 'FETCH FIRST ROW WITH TIES'に変更すると動作します。 –

+0

@パトリックベーコン:ありがとう。あなたはもちろん正しいのです。 –

2
with av as (select avg(sal) avgsal from scott.emp) 
select emp.*, abs(emp.sal-av.avgsal) dist 
    from scott.emp, av 
    order by dist; 

上記は私にはうまく見えますが、おそらく解析機能を使ってみるとよいでしょう。

select empno, sal, SalDif 
from 
    (
    select empno, sal, abs(sal - (select avg(sal) from emp)) as SalDif 
    from emp 
    order by SalDif 
) 
where rownum = 1; 

またはCTEとして:サブクエリバック従業員データを引っ張る

select * from (
    select emp.*, abs(avg(emp.sal) over() - sal) diff 
    from scott.emp order by diff) 
where rownum = 1; 
2

:何かのように

with CTE as 
    (
    select empno, sal, abs(sal - (select avg(sal) from emp)) as SalDif 
    from emp 
    order by SalDif 
) 
select empno, sal, SalDif 
from CTE 
where rownum = 1; 
関連する問題