logo

PARTITION BYを使用したSQL Server Row_Number関数

行番号関数は、パーティション内でソートされた順序で各パーティション内の行に行番号を割り当てるために使用されるウィンドウ関数の 1 つです。 パーティション 句、PARTITION のみ 注文 句は OVER 句内で使用できます。その場合、テーブル全体が 1 つのパーティションと見なされます。ただし、ORDER BY 句は、 ROW_NUMBER() この関数はパーティション内の行をその論理順序で配置し、後で ROW_NUMBER() 関数で行番号を割り当てることができます。各パーティションの行番号は 1 から始まります。

構文:



ROW_NUMBER ( )

OVER ( [ PARTITION BYcol_1,col_2… ] ORDER BYcol_3,col_4..ASC または DESC) AS 列名

ROW_NUMBER() 関数のコンポーネント



  • パーティション分割: これは、行をウィンドウに分割し、各行の値を分割するメインの副次節です。 ウィンドウ関数 適用されて計算されます。
  • 注文方法: これはパーティション内の行を並べ替えるのに使用されます。デフォルトでは昇順です。 ORDER BY 句がないと、ROW_NUMBER() 関数は機能しません。
  • 戻り値の型: ROW_NUMBER() 関数の戻り値の型は BIGINT です。

ROW_NUMBER() 関数の使用法

ステップ1: 次の SQL クエリを使用して、データベース Geeksforgeeks を作成します。

クエリ

CREATE DATABASE Geeksforgeeks>

GFG データベースを使用します。



クエリ

USE techcodeview.com>

ステップ 3: さまざまなセクションの生徒の合計点を 500 点満点で示す表を作成します。

クエリ

CREATE TABLE studentsSectionWise( studentId INT, studentName VARCHAR(100), sectionName VARCHAR(50), studentMarks INT  );>

ステップ 4: テーブルに行を挿入します。

クエリ

INSERT INTO studentsSectionWise VALUES (1, 'Geek1','A',461), (1, 'Geek2','B',401), (1, 'Geek3','C',340), (2, 'Geek4','A',446), (2, 'Geek5','B',361), (2, 'Geek6','C',495), (3, 'Geek7','A',436), (3, 'Geek8','B',367), (3, 'Geek9','C',498), (4, 'Geek10','A',206), (4, 'Geek11','B',365), (4, 'Geek12','C',485), (5, 'Geek13','A',446), (5, 'Geek14','B',368),  (5, 'Geek15','C',295),  (6, 'Geek16','C',495);>

ステップ5: 表を確認してください

SELECT * FROM studentsSectionWise>

出力:

学生セクションごとのテーブル

学生セクションごとのテーブル

CSSの最初の子

ROW_NUMBER() 関数での ORDER_BY 句の使用

単に ORDER BY 句を昇順または降順で使用すると、テーブル全体が 1 つのパーティションのみとみなされます。

すべてのセクションを含む ORDER BY 句を指定した ROW_NUMBER() 関数を使用して、生徒の RankNumber を確認してみましょう。

SELECT * , ROW_NUMBER() OVER ( ORDER BY studentMarks DESC) AS rankNumber FROM studentsSectionWise>

説明: クエリでは、DESC 順に並べられた studentsMarks で ORDER BY 句を使用しました。

出力:

出力

出力

説明: 結果では、テーブル全体が単一のパーティションとみなされ、rankNumber 番号が昇順で、studentsMarks が降順になっていることがわかります。

ROW_NUMBER() 関数での PARTITION_BY の使用

単純に PARTITION BY 句を使用すると、列名に基づいてテーブルが異なるパーティションに分割され、昇順または降順を指定した ORDER BY 句を使用すると、テーブル全体が 1 つのパーティションのみとみなされます。次に、 ROW_NUMBER() は、各パーティションの 1 から始まるそれぞれの一意の番号を関数します。

ROW_NUMBER() 関数と PARTITION BY 句および ORDER BY 句を使用して、セクションごとにランキングを確認してみましょう。

SELECT * , ROW_NUMBER() OVER (PARTITION BY sectionName ORDER BY studentMarks DESC) AS rankNumber FROM studentsSectionWise;>

説明: 使用したクエリでは PARTITION BY 句 テーブルをセクション名ごとに分割し、DESC で順序付けされた StudentsMarks を使用して ORDER BY 句でテーブルを分割します。

出力:

出力

出力

説明: 結果では、セクション名ごとにパーティションが分割されていることがわかります。各パーティションでは、学生は Studentmark に基づいて DESC 順序で並べられ、ROW_NUMBER() 関数によって、各パーティションで開始する行番号が増分されて割り当てられます。 。

PARTITION BY を使用しない ROW_NUMBER() について

SQL Server の ROW_NUMBER() 関数は、結果セット内の各行に一意の行番号を提供できる柔軟なツールです。 PARTITION BY 句を使用せずに使用しても同様に効果的ですが、パーティション内のグループ化とランク付けのために PARTITION BY 句と組み合わせてよく使用されます。 PARTITION BY 句を使用しない ROW_NUMBER() の可能性と使用法については、この記事で説明します。

構文:

選択する

ROW_NUMBER() オーバー ( 注文方法 YourOrderByColumn) として 行番号、

その他の列

から

あなたのテーブル名;

PARTITION BY 句と ORDER BY 句を使用せずに ROW_NUMBER() 関数を使用して、ランキング セクションを確認してみましょう。

SELECT * , ROW_NUMBER() OVER (ORDER BY studentMarks DESC) AS rankNumber FROM studentsSectionWise>

出力:

出力

出力

ROW_NUMBER() を使用して行のサブセットを取得する

ROW_NUMBER() 関数を使用すると、CTE を使用してテーブルから行のサブセットを取得できます。これは、データのページネーションの場合に役立ちます。

各クラスの上位2位を確認してみましょう。 CTE(共通テーブル式) ROW_NUMBER() 関数を使用:

WITH topTwoRankers AS  (   SELECT * , ROW_NUMBER() OVER (PARTITION BY sectionName ORDER BY studentMarks DESC) AS rankNumber  FROM studentsSectionWise  )  SELECT *  FROM topTwoRankers  WHERE rankNumber <=2;>

説明: ここのクエリでは、CTE 式を使用して上で使用したクエリから一時テーブルを取得し、外側の SELCT クエリを使用して、rankNumber が 2 以下の学生を取得しています。

出力:

出力

出力

説明: 結果では、各セクションの上位 2 つのランカーが、前の例で示したクエリから取得されたテーブルのサブセットであることがわかります。

の利点ROW_NUMBER()>PARTITION BYあり

  1. 高度なパーティションのランク付けが可能になります。
  2. 特定のグループ内で一意の行番号付けを有効にします。
  3. 広範な分析が必要な状況での柔軟性が向上します。

の利点ROW_NUMBER()>PARTITION BYなし

  1. 率直かつシンプル。
  2. 特定の列に従って項目を簡単にランク付けできます。
  3. 特に結果セットが小さい場合、パフォーマンスが向上する可能性があります。

結論

これは、パーティションに基づいて順序付けを行い、必要な操作を実行したい場合に非常に便利です。使用する ORDER BY 句 ROW_NUMBER() 関数を使用する場合は必須です。また、CTE を使用すると、順序付けされたパーティションからテーブルのサブセットを取得できます。 ROW_NUMBER() の主な使用例は、さまざまなパーティションに基づいて行をランク付けすることであり、データ分析の目的に非常に役立ちます。