17

選択した数の行のみが最高または最低の列値で返されるクエリをどのように作成しますか。

つまり、給与の高い上位 5 人の従業員のレポートですか。

4

5 に答える 5

26

これを行う最善の方法は、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 を使用する理由はほとんどありません。

于 2010-02-21T17:59:17.840 に答える
13

これを試してください:

SELECT * FROM 
    (SELECT field1, field2 FROM fields order by field1 desc) 
where rownum <= 5

また、rownum がどのように機能するかについての詳細な説明については、このリソースを参照してください。

于 2010-02-21T17:46:20.190 に答える