SCOTT Schemaを使用してください。私は給料が平均に最も近い人を取得しようとしています。Oracle SCOTTスキーマの問合せ - 平均に最も近い給与は何ですか?
SELECT sal
FROM ( SELECT sal
FROM emp
ORDER BY ABS ((SELECT AVG (SAL) FROM EMP) - sal))
WHERE ROWNUM = 1;
上記の解決策は改善できますか?
SCOTT Schemaを使用してください。私は給料が平均に最も近い人を取得しようとしています。Oracle SCOTTスキーマの問合せ - 平均に最も近い給与は何ですか?
SELECT sal
FROM ( SELECT sal
FROM emp
ORDER BY ABS ((SELECT AVG (SAL) FROM EMP) - sal))
WHERE ROWNUM = 1;
上記の解決策は改善できますか?
あなたは非標準の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;
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;
:何かのように
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;
こんにちは、私の12Cデータベースと、句を制限するあなたの行はエラーをスローします。あなたの節を 'FETCH FIRST ROW WITH TIES'に変更すると動作します。 –
@パトリックベーコン:ありがとう。あなたはもちろん正しいのです。 –