ServerSQLServerのT-SQLで上位n件のデータを取得する方法を紹介します。SQLServerにはランキング上位を取得するために使える関数などが用意されているのでそれを使用します。BY句を使って取得する上位n件を取得するためのテーブルとデータ上位n件のデータを取得するために、テーブルを準備します。テーブルは学生の成績を保持します。テーブルの列には学生ID、氏名、得点の3つを作成します。上位ランキングの判定は得点列に対して行います。テーブルの定義と登録するデータは以下のようになります。383);上記のSTUDENT_GRADEテーブルへのデータのインサートは、複数のレコードを1回のSQLで一括挿入する形式で記述しています。1回のINSERTで複数行のレコードをテーブルに一括で挿入する方法については、以下の記事を参照してください。1回のINSERT(インサートSQL)で複数行のレコードを一括挿入(追加)するSQLServerやMySQLなどのデータベースで、テーブルにレコードをINSERT文使用して追加するには、通常は以下のように記述します。BY句とTOP句を使う方法などがあります。RANK関数を使って取得するSQLServerのRANK関数は文字通り、取得するレコードにランクを付けることができる関数です。RANK関数の構文は以下に示す通りです。BY句)は取得するレコードをグループ化する際に使用します。GENDER」と指定します。clauseを指定しない場合は、すべてのレコードを1つのグループとして扱います。BY句)はレコードの順序を決めるのに必要なので、必ず指定します。以下にRANK関数で学生の成績(得点)に順位をつけて取得するSQLと取得結果の一覧を記載します。298RANK関数は同一の順位に対して同じ番号を付けます。上記の例では10位の「学生IDが10の学生」と「学生IDが1の学生」が同じ順位になっています。次の「学生IDが15の学生」の順位が12位になっています。学生の成績(得点)の順位をつけることができたので、上位n件のレコードを取得します。ここでは成績が上位10位までの学生を取得します。BYSCORE_RANKRANK関数で順位を付けて取得するSELECT文をサブクエリにします。(9行目~17行目)サブクエリにした結果表のSCORE_RANK列に対して10以下のレコードのみにWHERE句で絞るための条件を指定します。391RANK関数とDENSE_RANK関数の違いRANK関数とDENSE_RANK関数とはほとんど同じですが、取得するデータに同順位がある場合の次の順位の付け方が違います。RANK関数では10位の「学生IDが10の学生」と「学生IDが1の学生」が同じ順位なので、次の「学生IDが15の学生」の順位が12位になりますが、DENSE_RANK関数では順位が飛ばずに11位になります。ROW_NUMBER関数を使って取得するSQLServerのROW_NUMBER関数はRANK関数とは似ていますが少し違います。RANK関数は同じ順位に対して同じ番号を付けますが、ROW_NUMBER関数はすべての行に対して順番に番号を付けていきます。ROW_NUMBER関数の構文は以下に示す通りです。clauseと同様に、取得するレコードをグループ化する際に使用します。clauseを省略した場合は、すべてのレコードを対象に番号を付番します。BY句)はRANK関数のと同じです。この引数の指定は必須です。以下にROW_NUMBER関数で学生の成績(得点)に順位をつけて取得するSQLと取得結果の一覧を記載します。298ROW_NUMBER関数の場合はすべての行に順位を付けますので、例えば上位10件を取得する場合に1~9位までは1人ずついるが10位が2人以上いた場合に、同順位の10位のいずれか1人の順位が11位になります。上記の例では、「学生IDが1の学生」が11位になっています。RANK関数の時と同様に、上位10件のレコードを取得します。391ROW_NUMBER関数で順位をつけて上位10件を取得した場合は「学生IDが1の学生」が対象から漏れています。BY句と組み合わせることで上位n件のレコードを取得することができます。BY句を使って学生の成績(得点)が上位10位までの学生を取得します。391取得できるレコードはROW_NUMBER関数を使って取得する場合と同じになります。今回はシンプルな例をご紹介しましたが、SQLServerにはRANK関数とROW_NUMBER関数という便利な関数が用意されているので、様々な用途で使用することができると思います。以前はRANK関数、ROW_NUMBER関数ともに実装されていなかったので、順位や行番号を付けたデータを取得するためには、自分で付番するSQLを書かなくてはいけませんでした。バージョンアップとともに便利な関数などが増えていくのは非常に喜ばしいことです。Studio(SSMS)を使用して、テーブルのデータを挿入(追加)、更新(修正)...記事を読むSQLServerのLEN関数では正確な文字数が取得できない場合SQLServerの文字列の文字数を取得するLEN関数ですが、正確に文字数を取得できない場合があるのでメモしておきます。Studio(SSMS)のクエリエディターで選択範囲を大文字・小文字に変換するSQLの記述方法は、人によって様々です。SELECTやFROMなどのキーワードを大文字で記述する人もいれば、小文字で記述する人もいます。MySQL]テーブルにレコードとして保存されているデータを取得する際に横に展開して1行にしたい場合があります。[SQLServer]データベースでは、テーブルはできるだけ分けて管理する方がよいと言われています。HAVING)大量のデータの中からあるキーとなる値が重複するレコードを抽出したい時があります。