スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

GGA お気に入り公開に関して

今年度も皆さまにはお世話になりましたので、
こっそりと私が使っているGGAお気に入りを限定公開。

とは言えこれが使えるかどうかは多分人それぞれです。
多分ストレートに使うと負ける気しかしません。

あと、量が膨大な上に(ざっと見て700個強…)、
処理負荷も相当なレベルになりますよ、とだけ。

ですので、拡張SQLの作り方には役立てるのではないでしょうかw

http://kie.nu/1zZH
パスワード:Genutrh

本日より1週間限定の公開としておきました。
興味のある方はどうぞ。
スポンサーサイト

GGA・拡張SQL記述方法(5)

ということでサンプル紹介の回。

・ 初芝・初ダート等の抽出

(SELECT COUNT(*) FROM D番組データ AS D_B INNER JOIN D競走馬データ AS D_K ON D_B.レースキー = D_K.レースキー WHERE (D_K.血統登録番号=D競走馬データ.血統登録番号) AND (D_B.年月日 < D番組データ.年月日) AND (D_B.芝ダ障害コード = D番組データ.芝ダ障害コード) ) = 0

GGAでレース情報→芝ダ障害コードで今回の条件を入力してこのSQLを入力すれば、「今回の条件(芝・ダ・障害)が初出走の馬」を抽出します。


SQLだけで完結させたい方はこちらでもOK。

(SELECT COUNT(*) FROM D番組データ AS D_B INNER JOIN D競走馬データ AS D_K ON D_B.レースキー = D_K.レースキー WHERE (D_K.血統登録番号=D競走馬データ.血統登録番号) AND (D_B.年月日 < D番組データ.年月日) AND (D_B.芝ダ障害コード = '2') ) = 0

(D_B.芝ダ障害コード = '2') の部分の数字を変えれば同様の抽出は出来ます。1が芝、2がダート、3が障害になります。

ただし新馬戦なども抽出されますので、それを除きたい場合はGGAで新馬以外とやってあげれば良いかと。SQLで記述する場合は (D番組データ.条件 <> 'A1') となりまーす。


・ 展開予想図各位置トップの抽出

(select count(*) from D競走馬データ AS D_K WHERE D競走馬データ.レースキー = D_K.レースキー and D競走馬データ.ゴール内外 = D_K.ゴール内外 and D競走馬データ.ゴール差 > D_K.ゴール差 ) = 0

展開予想図における最内~大外の最先着馬の抽出SQLです。=1に修正すれば各位置の2番手の馬が抽出可能になります。JRDV.spで良くやっている四隅抽出もこれから作成は可能かと思います。

GGA・拡張SQL記述方法(4)

3回にわたって簡単なGGA拡張SQLの記述方法を並べてみましたが、こういうやり方ならば案外楽に作れる筈です。とは言え触れていない注意事項が数件ありましたので、一応列挙。


・ 同一SQL内に複数のcount条件は置かない

( ( (SELECT COUNT(*) ~条件A~) >= 1 ) or ( (SELECT COUNT(*) ~条件B~) = 1 ) )

こういう感じにはしない方が良いかと思います。理論上は大丈夫なのですが、大体が検索段階で異様なほど時間が掛かって処理落ちします。それであれば、別個に作成した上で保存しておいた方が良いかと。ただ、その分お気に入りの数が膨大に増加しますが…。おかげで私のお気に入りの数は軽く400を超える羽目になっています。


・ or条件の中身が長くなるSQLは分割した方が良い

これも実践上での注意事項です。例えばあるコースで未勝利戦ならば京都1800で上がり35.0以内、500万なら京都1600で上がり34.5以内…と言った様な複雑な条件を作成するとなると、
(未勝利戦で京都1800、上がり35.0以内) or (500万で京都1600、上がり34.5以内) or …
というようにor条件の中身が相当長くなります。これを実行しようとすると検索時間が掛かり、処理落ち必須になりますのでそういう条件ならば分割してあげた方が無難です。

一応or条件の中身が2~3個程度ならば利用に耐えうるとは思いますが、その辺りは自身のPCスペックと相談してみてください。


・ 使わない表は結合しない(方が良い)

DBの話をすると、実は処理時間が一番掛かるのは検索部分ではなく、表の合体(結合)になることが殆どです。サンプルとして紹介したSQLは3つの表を結合させていますが、検索条件次第では使わない表が出てくるかもしれません。その場合は削ってしまった方が無難です。実例は下記に。


(SELECT COUNT(*) FROM D番組データ AS D_B INNER JOIN (D競走馬データ AS D_K INNER JOIN D成績データ AS D_S ON D_K.競走成績キー = D_S.競走成績キー) ON D_B.レースキー = D_K.レースキー WHERE (D_K.血統登録番号=D競走馬データ.血統登録番号) AND (D_B.年月日 < D番組データ.年月日) and (left(D_B.レースキー,2) = '01' OR left(D_B.レースキー,2) = '02') ) = 0

このSQLではD成績データ(D_S)が使われていませんので削除します。ただし削除する場合は、WHEREの前部分でD_S表が絡んでいる部分を全削除する必要があります。ということで削除したSQLが下記。


(SELECT COUNT(*) FROM D番組データ AS D_B INNER JOIN D競走馬データ AS D_K ON D_B.レースキー = D_K.レースキー WHERE (D_K.血統登録番号 = D競走馬データ.血統登録番号) AND (D_B.年月日 < D番組データ.年月日) and (left(D_B.レースキー,2) = '01' OR left(D_B.レースキー,2) = '02') ) = 0


これに関しては無理にやる必要はないでしょう。ただスペックの問題があったり、もしくは簡単なSQL知識のある方は是非。


次回はすぐ使えるサンプルご紹介を。

GGA・拡張SQL記述方法(3)

さて、ここからは実例込みで行きましょう。


(1) 今回の条件をセットする

sql-1.jpg


GGAのいつもの作業ですね。今回の検索するレース条件をざざっと打ちこみます。


(2) SQLのテンプレを作る

sql-2.jpg


これも前回テンプレをコピペして削ればOKです。エディタがあると随分便利ですね。メモ帳でも良いのですが、横に伸びて行ってしまうのでお勧めしたくはないです。


(3)過去でどんな履歴を出した馬が良いかを考える

方向性がはっきりしていると楽ですね。例えば「中京・京都・阪神D1400で良・稍重時テン35.5以内/重・不良時テン35.0以内を出した馬」という条件で行ってみましょうか。


(4)GGAの条件をコピペしながら進めていく

ここから重要。順番を追って一個ずつ行きましょう。

① GGAの拡張モードを開いた上で条件を入力する

比較対象の部分は「今走」で。必要条件を選んでOKを押下。

sql-3.jpg


この様に拡張部分に出てくると思います。それをコピーしてエディタに移動。

② 条件の最後に and を入れる

今回の場合だと、(D_B.年月日 >= D番組データ.年月日 - 10000) の部分が最後尾になります。この後ろに and と入れてあげてこんな感じに。

sql-4.jpg


③ andの後ろにコピペしてきた条件を入れる

sql-5.jpg


まんまペーストで貼り付けます。

表名を変更する

これ超重要。このままでは今走のデータしか見てくれないので、表名を直します。SQLの上の部分を見ると、「D番組データ AS D_B」となっているので表名をD_Bにすれば過去のデータを見ることになります。と言う訳でその部分を直しましょう。

sql-6.jpg


直しました。これで一項目完成です。あとは同様に打って直して~を繰り返すとこんな感じになります。

sql-7.jpg


若干GGA経由とは違ってます(GGAからSQL発行するとinとかbetweenとか搭載されてません)が、まぁ気にしないで下さい。で、最後のお仕事。

()の開始/終了場所のチェック

これも非常に重要な作業。一個ミスして、)が足りなかったりすると律儀にエラー吐いてくれます。こんな感じ。

sql-8.jpg
sql-9.jpg


これが出た時は()の閉じ忘れが原因だと思われます。なので一個ずつチェックを入れて行きましょう。私はエディタとして秀丸を使ってますが、これ便利。()の先頭にカーソルを合わせると最後がどこだというのが強調される様になっています。こんな感じですね。

sql-10.jpg


上の図では最初の( と最後の) が強調されてるのがお分かりでしょうか?


あとは検索します。可能であれば先にこの条件で検索される馬とレースを探しておいてから検索をした方が良いかと思われます。そうしないと変な検索結果になっていることに気付けませんからね。


注意事項として、全体的にこの拡張SQLは検索するのに時間が掛かります。特に初回検索時はマシンパワーにも寄りますがそこそこ掛かると言うこと、あとは普段のお気に入り計算時にも相応の時間は掛かりますので、非力なPCではやらない方が身の為だと思います。一応メモリ2Gあれば何とかなるとは思いますが。


あ、私はSQLの専門家ではないので、こんな条件はどうやって出すんですか?とかは聞かないで下さいませw 私は自分の様なSQL素人が複雑な条件を少しでも楽に作る方法を考えただけですので。

ではでは、良いGGAライフを!

GGA・拡張SQL記述方法(2)

さて、もう一つだけ。再度サンプルを提示。

(SELECT COUNT(*) FROM D番組データ AS D_B INNER JOIN (D競走馬データ AS D_K INNER JOIN D成績データ AS D_S ON D_K.競走成績キー = D_S.競走成績キー) ON D_B.レースキー = D_K.レースキー WHERE (D_K.血統登録番号=D競走馬データ.血統登録番号) AND (D_B.年月日 < D番組データ.年月日) AND (D_B.年月日 >= D番組データ.年月日 - 10000) and (D_B.芝ダ障害コード = '2') and (D_B.距離 = '1200') and ((left(D_B.レースキー,2) in ('04','06')) ) and ( ( (D_S.馬場状態 in ('10','11','12','20','21','22')) and (D_S.前3F >= 0 AND D_S.前3F <=350) ) or ( (D_S.馬場状態 in ('30','31','32','40','41','42')) and (D_S.前3F >= 0 AND D_S.前3F <=345) ) ) and ((D番組データ.条件=D_B.条件) and ((D_S.着順 between 1 AND 5) or (D_S.[1(2)着タイム差] >= '000' AND D_S.[1(2)着タイム差] <= '005' )) )) >= 1


その内、最初と最後の部分がほぼ使い回しになります。該当部分を強調するとこんな感じ。

(SELECT COUNT(*) FROM D番組データ AS D_B INNER JOIN (D競走馬データ AS D_K INNER JOIN D成績データ AS D_S ON D_K.競走成績キー = D_S.競走成績キー) ON D_B.レースキー = D_K.レースキー WHERE (D_K.血統登録番号=D競走馬データ.血統登録番号) AND (D_B.年月日 < D番組データ.年月日) AND (D_B.年月日 >= D番組データ.年月日 - 10000) and (D_B.芝ダ障害コード = '2') and (D_B.距離 = '1200') and ((left(D_B.レースキー,2) in ('04','06')) ) and ( ( (D_S.馬場状態 in ('10','11','12','20','21','22')) and (D_S.前3F >= 0 AND D_S.前3F <=350) ) or ( (D_S.馬場状態 in ('30','31','32','40','41','42')) and (D_S.前3F >= 0 AND D_S.前3F <=345) ) ) and ((D番組データ.条件=D_B.条件) and ((D_S.着順 between 1 AND 5) or (D_S.[1(2)着タイム差] >= '000' AND D_S.[1(2)着タイム差] <= '005' )) ) )>= 1


はっきり言ってしまえば、この部分はまるまるコピペで良いです。

ただ、今後に向けての注意点として何点かありますので、そこだけ記述を。


(1) 当日データと過去データのテーブル名称が違う

このGGA用拡張SQLを作る際に勘違いしがち(+ミスの大多数はこれ)なので一応触れておきます。

SQL1行目の

D番組データ AS D_B

この部分ですね。これが何をやってるかというと、過去歴として扱う方の「D番組データ」という表は「D_B」という名称で今後扱いますよ、という宣言です。当日データとして扱うD番組データとは別の表として使用しますが、これが非常に厄介になります。
同様に、1行目の後半以降でも

D競走馬データ AS D_K
D成績データ AS D_S


という記述が2箇所出てきますが、これも過去歴として扱うそれぞれの表を「D_K」「D_S」として扱いますという宣言です。

実例として、3行目の後半で

(D_B.年月日 < D番組データ.年月日)

という部分が出てきますが、これは「今回のレース年月日より過去歴の年月日の方が古いデータしか見ませんよ」
という意味になってきます。この部分ではあまり関係はありませんが、こういう様に使っていきますし今後はこれがメインになって行きます。


(2) 該当馬の過去1年での戦績検索ならこのままでOK。ただし、その馬の全戦績を検索する場合は (D_B.年月日 >= D番組データ.年月日 - 10000) の部分をカットすること

JRDBの年月日データ仕様を見ると、YYYYMMDD仕様とのこと。なので、過去1年での履歴から抽出するのならばYYYYの最下位の数字を1減らせば良いので、10000を引くことになります。同様に過去2年なら20000を引けばOKです。過去半年のみの抽出だと6000を引けば良いんでしょうが、それなら新聞とかを見た方が圧倒的に早いので(笑) 個人的には過去1年or全履歴という使い方が多いです。


(3) 最後の部分はその条件を何回以上クリアしたかという回数になる

そのままです。例えばこの条件を2回以上クリアした馬のみを抽出する場合はこの数字を2にすれば良いし、逆に一度もクリアしていない馬のみの抽出の場合は 「 >= 1 」の部分を 「=0」としてしまえば良いです。


この知識さえあれば、あとはGGAとの併用で作り込む作業になります。詳細は次回。
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。