SQL入門
SQL基礎問題6:成績表から教科ごとの点数ベスト3を抽出

SQLの初心者向け入門解説、VBAからデータベースを扱うためのSQLを解説
公開日:2025-11-02 最終更新日:2025-11-03

SQL基礎問題6:成績表から教科ごとの点数ベスト3を抽出


成績表テーブルから各教科ごとの点数ベスト3を抽出。


SQLの練習用になるべく単純なSQLで済む問題を出します。
SQLの練習として取り組んで見てください。

問題

成績表から教科ごとの点数ベスト3を抽出
※画像はExcelです。
生徒ID 生徒名 教科名 点数 教科名 生徒名 点数
1 佐藤 健太 国語 43 国語 高橋 悠人 98
1 佐藤 健太 数学 66 国語 中村 美咲 91
1 佐藤 健太 英語 61 国語 伊藤 大輔 77
2 中村 美咲 国語 91 数学 渡辺 花音 98
2 中村 美咲 数学 88 数学 中村 美咲 88
2 中村 美咲 英語 55 数学 山本 彩香 73
3 高橋 悠人 国語 98 数学 伊藤 大輔 73
3 高橋 悠人 数学 37 英語 高橋 悠人 96
3 高橋 悠人 英語 96 英語 渡辺 花音 96
4 山本 彩香 国語 68 英語 山本 彩香 79
4 山本 彩香 数学 73
4 山本 彩香 英語 79
5 伊藤 大輔 国語 77
5 伊藤 大輔 数学 73
5 伊藤 大輔 英語 47
6 渡辺 花音 国語 50
6 渡辺 花音 数学 98
6 渡辺 花音 英語 96

【SQL問題】※難易度は🤔
TBL成績:画像参照
・各教科ごとに、点数順位が3位以内のデータを抽出する。
・同点は同順位(RANK.EQ 相当)とし、2位や3位が複数いる場合は該当者全員を出力。
・出力順は、教科名を昇順、点数を降順とする。
※同順位の扱いが難しい場合は、まずは上位3名のみでもよい。


解答SQL

SQLite3
相関サブクエリ
SELECT T1.教科名,T1.生徒名,T1.点数
 FROM TBL成績 AS T1
 WHERE
   (SELECT COUNT(*)
    FROM TBL成績 AS T2
    WHERE T2.教科名 = T1.教科名 AND T2.点数 > T1.点数
   ) + 1 <= 3
 ORDER BY T1.教科名, T1.点数 DESC
自己結合+HAVING
SELECT T1.教科名,T1.生徒名,T1.点数
 FROM TBL成績 AS T1
 LEFT JOIN TBL成績 AS T2 ON T1.教科名 = T2.教科名 AND T1.点数 < T2.点数
 GROUP BY T1.教科名,T1.生徒名,T1.点数
 HAVING COUNT(T2.点数) <= 2
 ORDER BY T1.教科名,T1.点数 DESC
WINDOW関数
SELECT T1.教科名,T1.生徒名,T1.点数
 FROM
   (SELECT T2.教科名,T2.生徒名,T2.点数,
    RANK() OVER (PARTITION BY T2.教科名 ORDER BY T2.点数 DESC) AS rank_num
    FROM TBL成績 AS T2
   ) AS T1
 WHERE rank_num <= 3
 ORDER BY T1.教科名,T1.点数 DESC

SQLの解説
手法(SQLテクニック) 特徴
相関サブクエリ 外部クエリの各行に対してサブクエリが実行され、その結果(順位)に基づいてフィルタリングします。
自己結合+HAVING 同じテーブルを結合し、自分より点数が高いレコードの数をカウントしてフィルタリングします。
WINDOW関数 SQL標準の関数を用いて、パーティション(教科名)ごとに順位を付けてフィルタリングします。

  1. 相関サブクエリ
    特徴考え方: 自分の点数よりも高い点数のレコードがいくつあるか(=自分より上位の人数)を、メインクエリの行ごとにサブクエリで数えます。
    抽出条件: 「自分より上位の人数 + 1(自分自身) <= 3」でフィルタリングします。
    懸念点: 行ごとにサブクエリが実行されるため、処理速度が遅くなりがちです。

  2. 自己結合+HAVING
    特徴考え方: テーブル自身と、「同じ教科で自分より点数が高いレコード」をLEFT JOINで結合し、GROUP BYで集約します。
    抽出条件: HAVING COUNT(高い点数のレコード) <= 2」でフィルタリングします。
    懸念点: 結合処理が複雑で、SQLの可読性が低くなりがちです。

  3. WINDOW関数
    特徴考え方: RANK()関数を用いて、PARTITION BY(教科ごと)に点数順で順位を計算し、一時的に列として付与します。
    抽出条件: 付与された順位の列(rank_num)が「<= 3」でフィルタリングします。
    推奨度: 最も効率的で、可読性も高く、現代的なSQLで推奨される手法です。

Excel
相関サブクエリ
=LET(sql,
"SELECT T.教科名,T.生徒名,T.点数
 FROM ?TBL AS T
 WHERE
   (SELECT COUNT(*)
    FROM ?TBL AS S
    WHERE S.教科名 = T.教科名 AND S.点数 > T.点数
   ) + 1 <= 3
 ORDER BY 教科名, 点数 DESC",
QUERY(SUBSTITUTE(sql,"?TBL","[TBL成績$A2:D20]")))
自己結合+HAVING
=LET(sql,
"SELECT T1.教科名,T1.生徒名,T1.点数
 FROM ?TBL AS T1
 LEFT JOIN ?TBL AS T2 ON T1.教科名 = T2.教科名 AND T1.点数 < T2.点数
 GROUP BY T1.教科名,T1.生徒名,T1.点数
 HAVING COUNT(T2.点数) <= 2
 ORDER BY T1.教科名,T1.点数 DESC",
QUERY(SUBSTITUTE(sql,"?TBL","[TBL成績$A2:D20]")))

SQLの解説
全体としてはSQLiteと同じですので、解説は省略します。


※SQLの作成及び解説には生成AIの助けを借りています。特に解説文においてはAI出力を多く使用しています。





同じテーマ「SQL入門」の記事

SQL基礎問題1:最大在庫数を持つ製品の在庫金額
SQL基礎問題2:文字列「-nn-」のnnが偶数のみ抽出
SQL基礎問題3:文字列の一部をキーにして集計
SQL基礎問題4:2つのテーブルの不一致を抽出
SQL基礎問題5:複数のマスタテーブルの結合
SQL基礎問題6:成績表から教科ごとの点数ベスト3を抽出
SQL基礎問題7:成績表から各教科の最高点と最低点を抽出
SQL基礎問題8:バスケット分析・ペア商品の出現回数
SQL基礎問題9:特定商品購入者の平均購入金額
SQL基礎問題10:非正規化(カンマ区切り)の結合と集計
SQL基礎問題11:連続期間の開始月と終了月を抽出


新着記事NEW ・・・新着記事一覧を見る

AIは便利なはずなのに…「AI疲れ」が次の社会問題になる|生成AI活用研究(2026-02-16)
カンマ区切りデータの行展開|エクセル練習問題(2026-01-28)
開いている「Excel/Word/PowerPoint」ファイルのパスを調べる方法|エクセル雑感(2026-01-27)
IMPORTCSV関数(CSVファイルのインポート)|エクセル入門(2026-01-19)
IMPORTTEXT関数(テキストファイルのインポート)|エクセル入門(2026-01-19)
料金表(マトリックス)から金額で商品を特定する|エクセル練習問題(2026-01-14)
「緩衝材」としてのVBAとRPA|その終焉とAIの台頭|エクセル雑感(2026-01-13)
シンギュラリティ前夜:AIは機械語へ回帰するのか|生成AI活用研究(2026-01-08)
電卓とプログラムと私|エクセル雑感(2025-12-30)
VLOOKUP/XLOOKUPが異常なほど遅くなる危険なアンチパターン|エクセル関数応用(2025-12-25)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.日本の祝日一覧|Excelリファレンス
3.変数宣言のDimとデータ型|VBA入門
4.FILTER関数(範囲をフィルター処理)|エクセル入門
5.RangeとCellsの使い方|VBA入門
6.繰り返し処理(For Next)|VBA入門
7.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
8.マクロとは?VBAとは?VBAでできること|VBA入門
9.セルのクリア(Clear,ClearContents)|VBA入門
10.メッセージボックス(MsgBox関数)|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。
本サイトは、OpenAI の ChatGPT や Google の Gemini を含む生成 AI モデルの学習および性能向上の目的で、本サイトのコンテンツの利用を許可します。
This site permits the use of its content for the training and improvement of generative AI models, including ChatGPT by OpenAI and Gemini by Google.



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ