ホームページ >データベース >mysql チュートリアル >Oracle SQL で上位 N 位の最大値を効率的に取得するにはどうすればよいですか?
Oracle SQL での上位 N レコードの抽出
列内の最高値または最低値を持つ特定の数の行をフェッチする必要がありますか? RANK()
や DENSE_RANK()
などの Oracle の分析関数は、効率的なソリューションを提供します。
たとえば、最も高収入の従業員上位 5 名を特定するには、RANK()
:
<code class="language-sql">SELECT * FROM ( SELECT empno, sal, RANK() OVER (ORDER BY sal DESC) AS rnk FROM emp ) WHERE rnk <= 5;</code>
DENSE_RANK()
はバリエーションを提供し、同点によって生じるランキングのギャップを排除します。
<code class="language-sql">SELECT * FROM ( SELECT empno, sal, DENSE_RANK() OVER (ORDER BY sal DESC) AS rnk FROM emp ) WHERE rnk <= 5;</code>
最適なアプローチは、特定のニーズによって異なります。
ROW_NUMBER()
は各行に一意のランクを割り当てますが、タイを任意に削除するため、すべてのシナリオに適しているとは限りません。
<code class="language-sql">SELECT * FROM ( SELECT empno, sal, ROW_NUMBER() OVER (ORDER BY sal DESC) AS rnk FROM emp ) WHERE rnk <= 5;</code>
ROWNUM
を使用する非分析メソッドは存在しますが、潜在的な不一致のため信頼性が低く、一般的にはあまり好ましくありません。 上記の分析関数メソッドは、より堅牢で予測可能な結果を提供します。
以上がOracle SQL で上位 N 位の最大値を効率的に取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。