選択した数の行のみが最高または最低の列値で返されるクエリをどのように作成しますか。
つまり、給与の高い上位 5 人の従業員のレポートですか。
これを行う最善の方法は、RANK() または DENSE_RANK() などの分析関数を使用することです ...
SQL> select * from (
2 select empno
3 , sal
4 , rank() over (order by sal desc) as rnk
5 from emp)
6 where rnk <= 5
7 /
EMPNO SAL RNK
---------- ---------- ----------
7839 5000 1
7788 3000 2
7902 3000 2
7566 2975 4
8083 2850 5
7698 2850 5
6 rows selected.
SQL>
DENSE_RANK() は、同点の場合にギャップを圧縮します。
SQL> select * from (
2 select empno
3 , sal
4 , dense_rank() over (order by sal desc) as rnk
5 from emp)
6 where rnk <= 5
7 /
EMPNO SAL RNK
---------- ---------- ----------
7839 5000 1
7788 3000 2
7902 3000 2
7566 2975 3
8083 2850 4
7698 2850 4
8070 2500 5
7 rows selected.
SQL>
どちらの動作を優先するかは、ビジネス要件によって異なります。
正確な行数を返すために使用できる ROW_NUMBER() 分析関数もあります。ただし、同点の場合にビジネス ロジックが結果セットを任意に切り捨てる場合を除き、行番号に基づくソリューションの使用は避ける必要があります。上位 5 つの値を求めることと、上位の値でソートされた最初の 5 つのレコードを求めることには違いがあります。
ROWNUM 疑似列を使用した非分析ソリューションもあります。これは、ROWNUM が ORDER BY 句の前に適用され、予期しない結果につながる可能性があるため、扱いにくいものです。ROW_NUMBER() やランキング関数の代わりに ROWNUM を使用する理由はほとんどありません。
これを試してください:
SELECT * FROM
(SELECT field1, field2 FROM fields order by field1 desc)
where rownum <= 5
また、rownum がどのように機能するかについての詳細な説明については、このリソースを参照してください。