従業員テーブルから2番目に高い給与を取得するために使用できる事前定義された関数またはメソッドはありますか?
5 に答える
これを行う方法は、Oracle の分析関数を使用することです。あなたの特定のシナリオは、別のスレッドで提供したソリューションの単なる変形です。
2 番目に高い給与を選択するだけの場合は、DENSE_RANK()、RANK()、および ROW_NUMBER() のいずれかでうまくいきます。
SQL> select * from
2 ( select sal
3 , rank() over (order by sal desc) as rnk
4 from
5 ( select distinct sal
6 from emp )
7 )
8 where rnk = 2
9 /
SAL RNK
---------- ----------
3000 2
SQL>
ただし、給与が 2 番目に高い従業員の名前など、追加情報を選択する場合は、選択した関数が結果に影響します。どちらかを選択する主な理由は、同点の場合に何が起こるかです。
ROW_NUMBER() を使用すると、給与順に並べられた 2 番目の従業員が返されます。2 人の従業員が最高の給与を同列に並べている場合はどうなるでしょうか。2 番目に高い給与で同数の従業員が 2 人いた場合はどうなるでしょうか。ただし、RANK() を使用し、2 人の従業員が 1 番目に高い給与で同点の場合、RANK = 2 のレコード はありません。
これらの場合、通常は DENSE_RANK() を選択するのが最も安全な関数であると思いますが、実際には特定のビジネス要件に依存します。
Oracle では、次のようなクエリを使用して、ページ化された結果 (行 M から N) を返します。
SELECT NAME, salary
FROM (SELECT NAME, salary, ROWNUM r
FROM (SELECT NAME, salary
FROM employee
ORDER BY salary DESC
)
WHERE ROWNUM <= :N
)
WHERE r >= :M
または、分析を使用できます。
SELECT NAME, salary
FROM (SELECT NAME, salary, row_number() over (ORDER BY salary DESC) n
FROM employee)
WHERE n BETWEEN :M AND :N
テーブルから上位 n 件の給与を見つけたい場合は、次のように使用できます。
select min(sal)from (select distinct sal from emp order by sal desc) where rownum<=n;
ここで、n は 1、2、3、...、n です
テーブルから最大給与を見つけるのは非常に簡単なプロセスです。
これを試して:
SELECT * FROM employee emp WHERE 2=(SELECT COUNT(*) FROM employee WHERE
salary >= emp.salary);