Alma Core Pro かんたんSQL講座

第5回 最高峰編:過去3走の指数(前走・前々走・3走前)と「近3走平均指数」の自動算出

1. なぜ「過去3走」の指数がプロ予想で必須なのか?

当日の想定指数(1走分)だけを見ていると、「前走たまたま展開がドハマりして高い指数が出た馬」や「前走不利を受けて指数を落とした実力馬」を見誤ってしまいます。

真の実力を正確に見抜くには、**「前走(ST1)・前々走(ST2)・3走前(ST3)の推移」**と、それらを平均した**「近3走平均ST指数(AVG_ST3)」**を横並びで比較することが不可欠です。

💡 今回作成する分析シートのイメージ:

出馬表の右側に、「前走ST」「前々走ST」「3走前ST」「近3走平均ST」がズラリと横並びになり、近3走平均が高い順にソートされたプロ仕様の予想表が一瞬で完成します。

2. 仕組み:過去走に背番号を振る「ROW_NUMBER()」

データベースには過去何年分ものレース結果が縦に並んで入っています。この中から「各馬の直近3走だけ」を抜き出すために、**ウィンドウ関数**という強力なツールを使います。

魔法の呪文:ROW_NUMBER() OVER (PARTITION BY ... ORDER BY ...)
ROW_NUMBER() OVER (
    PARTITION BY d.horse_code 
    ORDER BY d.race_date DESC
) AS rn

このコードがやっていること:

  • PARTITION BY d.horse_code ➔ 馬(馬コード)ごとにデータを山分けする
  • ORDER BY d.race_date DESC ➔ 日付が新しい順(直近順)に並べる
  • ROW_NUMBER() ... AS rn ➔ 新しい順に 1 (前走), 2 (前々走), 3 (3走前)... と背番号(連番)を自動で振る

3. クエリの全体構造(3段階ステップの分解図)

一見すると長く複雑に見えるプロ仕様クエリですが、**3つの部屋(ブロック)**に分かれて順に処理されています。

ブロック名 使っている技術 処理内容・役割
① past_stride WITH 句(一時的な下準備)
ROW_NUMBER()
過去の出走データとストライド指数を結びつけ、各馬のレース履歴に新しい順に連番(rn = 1, 2, 3...)を振る。
② horse_past_summary CASE WHENAVG()
GROUP BY horse_code
連番が 1(前走)、2(前々走)、3(3走前)の指数を抜き出し、同時に3走分の平均ST指数を計算して1行にまとめる。
③ メインのSELECT LEFT JOIN(テーブル結合) 当日の出馬表に、場所マスタ・当日指数・そして②で計算した「過去3走サマリー」を合体させて画面に出力する。

4. そのまま使える!最高峰分析クエリ(完全版)

以下の枠内のSQLをコピーし、Alma Core Pro のクエリ入力欄に貼り付けて ▶ SQL実行📊 Excel用コピー (TSV) をお試しください。

WITH past_stride AS (
    -- ① 過去の出走履歴とストライド指数を紐付け、新しい順に連番(rn)を振る
    SELECT 
        d.horse_code,
        d.race_date,
        s.st,
        s.senko,
        s.tsuiso,
        ROW_NUMBER() OVER (
            PARTITION BY d.horse_code 
            ORDER BY d.race_date DESC
        ) AS rn
    FROM kol_den2 d
    INNER JOIN kol_stride s
        ON  d.race_date    = s.race_date
        AND d.venue_code   = s.venue_code
        AND d.race_number  = s.race_number
        AND d.horse_number = s.horse_number
    WHERE d.race_date < '20260816'
),
horse_past_summary AS (
    -- ② 前走(rn=1), 前々走(rn=2), 3走前(rn=3) を抽出し、平均値を算出
    SELECT 
        horse_code,
        MAX(CASE WHEN rn = 1 THEN st END) AS st_prev1,
        MAX(CASE WHEN rn = 2 THEN st END) AS st_prev2,
        MAX(CASE WHEN rn = 3 THEN st END) AS st_prev3,
        ROUND(AVG(CASE WHEN rn <= 3 THEN st END), 1) AS st_avg3
    FROM past_stride
    WHERE rn <= 3
    GROUP BY horse_code
)
-- ③ 当日の出馬表・競馬場マスタ・当日指数・過去3走サマリーを結合
SELECT 
    d.race_date AS 開催日,
    v.venue_name AS 競馬場,
    d.race_number AS R,
    d.horse_number AS 馬番,
    d.horse_name AS 馬名,
    d.jockey_name AS 騎手,
    s_curr.st AS 当日ST,
    p.st_prev1 AS 前走ST,
    p.st_prev2 AS 前々走ST,
    p.st_prev3 AS "3走前ST",
    p.st_avg3 AS "近3走平均ST",
    s_curr.senko AS 先行力,
    s_curr.tsuiso AS 追走力
FROM kol_den2 d
LEFT JOIN mst_venue v
    ON d.venue_code = v.venue_code
LEFT JOIN kol_stride s_curr
    ON  d.race_date    = s_curr.race_date
    AND d.venue_code   = s_curr.venue_code
    AND d.race_number  = s_curr.race_number
    AND d.horse_number = s_curr.horse_number
LEFT JOIN horse_past_summary p
    ON d.horse_code = p.horse_code
WHERE d.race_date = '20260816' 
  AND d.venue_code IN ('08', '8') 
  AND d.race_number = '11'
ORDER BY p.st_avg3 DESC;

5. 実行結果(返りデータ)と馬券検討の判断ポイント

上記クエリを実行すると、以下のように**近3走平均STが高い実力馬順**に綺麗に整列したデータが返ってきます。

📋 実行結果(返りデータ例:札幌11R 札幌記念)
開催日 競馬場 R 馬番 馬名 騎手 当日ST 前走ST 前々走ST 3走前ST 近3走平均ST 先行力 追走力
20260816札幌1110 アドマイヤテラ坂井 瑠星75.0 78.072.0- 75.049.057.0
20260816札幌1105 エコロヴァルツ横山 武史64.0 69.073.0- 71.046.038.0
20260816札幌1106 ローシャムパーク池添 謙一73.0 71.0-- 71.051.065.0
過去3走指数&平均ST 実行結果

当日指数・前走・前々走・3走前・近3走平均STが横並びになった分析シート

🎯 馬券検討の判断ポイント

6. 全5回完結:あなたがマスターしたSQLスキル総括

全5回の講習お疲れ様でした! 初心者向けの基本SELECTから、プロ仕様の高度な過去走集計まで、競馬データ分析に必要なすべての基盤スキルを完全に習得しました。

🏆 Alma Core Pro で身についたデータ分析スキル一覧:
  1. 第1回: SELECTAS(欲しい項目を日本語見出しで自由自在に抽出)
  2. 第2回: WHEREAND / OR / LIKE による高精度な条件スクリーニング)
  3. 第3回: GROUP BY & 集計関数(コース別・種牡馬別・枠番別の統計集計)
  4. 第4回: JOIN(出馬表・マスタ・指数・血統の完全統合によるオリジナル新聞生成)
  5. 第5回: CTE & ウィンドウ関数(過去走履歴の連番付け & 近3走平均指数の自動算出)

これらのクエリを活用することで、市販のツールでは真似できない独自の切り口から、高い回収率を生み出す高期待値馬をいつでも瞬時に発掘できるようになります。