SQL `ROW_NUMBER()` の理解: 構文、ユースケース、および例
Emily Parker
Product Engineer · Leapcell

Key Takeaways
ROW_NUMBER()
は、パーティション内の行に一意の連番を割り当てます。- ランキング、ページネーション、および重複検出に役立ちます。
ORDER BY
句は関数で必須です。
ROW_NUMBER()
関数は、SQL の強力なウィンドウ関数で、結果セット内の行に一意の連番を割り当てます。この関数は、ランキング、ページネーション、および重複の特定などのタスクに特に役立ちます。その構文、使用法、および実践的な例を掘り下げましょう。
構文
ROW_NUMBER() OVER ( [PARTITION BY partition_expression] ORDER BY sort_expression [ASC | DESC] )
ROW_NUMBER()
: 各行に連番を割り当てる関数。OVER
: 関数が動作するウィンドウまたは行のセットを定義します。PARTITION BY
(オプション):ROW_NUMBER()
関数が個別に適用されるように、結果セットをパーティションに分割します。ORDER BY
: 各パーティション内の行の順序を指定します。
ユースケース
1. 行への連番の割り当て
結果セット内の各行に一意の番号を割り当てるには:
SELECT ROW_NUMBER() OVER (ORDER BY salary DESC) AS row_num, first_name, last_name, salary FROM employees;
このクエリは、給与の降順で各従業員に行番号を割り当てます。
2. ページネーション
行のサブセットを取得してページネーションを実装します:
WITH numbered_employees AS ( SELECT ROW_NUMBER() OVER (ORDER BY employee_id) AS row_num, first_name, last_name FROM employees ) SELECT * FROM numbered_employees WHERE row_num BETWEEN 11 AND 20;
これは、employees
テーブルから 11 から 20 行目を取得します。
3. 重複の特定
特定の列に基づいて重複レコードを見つけるには:
WITH duplicates AS ( SELECT *, ROW_NUMBER() OVER (PARTITION BY email ORDER BY id) AS row_num FROM users ) SELECT * FROM duplicates WHERE row_num > 1;
これは、email
フィールドに基づいて重複するユーザーを識別します。
4. グループごとの上位 N 件
各グループ内の上位 N 件のエントリを見つけるには:
WITH ranked_sales AS ( SELECT salesperson_id, region, sales_amount, ROW_NUMBER() OVER (PARTITION BY region ORDER BY sales_amount DESC) AS rank FROM sales ) SELECT * FROM ranked_sales WHERE rank <= 3;
これは、販売額に基づいて各地域の上位 3 人の営業担当者を取得します。
考慮事項
ORDER BY
句は、ROW_NUMBER()
のOVER
句で必須です。PARTITION BY
が省略されている場合、関数は結果セット全体を単一のパーティションとして扱います。RANK()
およびDENSE_RANK()
とは異なり、ROW_NUMBER()
は、順序付け列に同順位がある場合でも、ギャップなしで一意の連番を割り当てます。
結論
ROW_NUMBER()
関数は、SQL で行に連番を割り当てるための汎用性の高いツールであり、ランキング、ページネーション、重複検出などのタスクを容易にします。この関数を理解して活用することで、複雑なデータ分析と操作を簡単に行うことができます。
FAQs
指定された順序に基づいて、各行に一意の整数を割り当てます。
これを使用して番号を割り当て、次に番号を使用して結果をフィルタリングします。
いいえ、常に同順位に関係なく連続した番号を生成します。
Leapcell は、バックエンドプロジェクトをホストするための最適な選択肢です。
Leapcell は、Web ホスティング、非同期タスク、および Redis の次世代サーバーレスプラットフォームです。
多言語サポート
- Node.js、Python、Go、または Rust で開発します。
無制限のプロジェクトを無料でデプロイ
- 使用量に応じてのみ支払い — リクエストも料金もありません。
比類のない費用対効果
- アイドル料金なしの従量課金制。
- 例:25 ドルで、平均応答時間 60 ミリ秒で 694 万件のリクエストをサポートします。
合理化された開発者エクスペリエンス
- 簡単なセットアップのための直感的な UI。
- 完全に自動化された CI/CD パイプラインと GitOps の統合。
- 実用的な洞察のためのリアルタイムのメトリクスとロギング。
簡単なスケーラビリティと高性能
- 簡単な高並行処理に対応する自動スケーリング。
- 運用上のオーバーヘッドがゼロ — 構築に集中するだけです。
詳細については、ドキュメントをご覧ください。
X でフォローしてください: @LeapcellHQ