2016年7月19日火曜日

やっぱりちゃんとしたDBの方が便利です

JRDBの各種データをAccessで分析出来るツールがありますが、個人的にはAccessはあまり好きではありません。
昔、まだ普通のJRDB会員だった頃、僕はAccessでは無くSQLサーバーでデータを管理しておりました。
今はカナリ環境も整っており、データをダウンロードしてSQLサーバーにアップするようなツールも結構簡単に作れると思います。

たまに掲示板でも質問が来るような、ランキング系や集計の問題も今のDBであればサブクエリを使わずに実現出来ます。
例えば、1着馬からのタイム差を出すような場合。

海外のレース結果は、1着馬のタイム、以下は各着順の馬身しか発表されません。
2着以下のタイムなぞには興味がねえ、という伝統なのでしょうね。
香港だとキッチリ全て出してくれるので文化の差なのかなと。

今年の英ダービーだとこのように。

着順 馬名 馬身1 馬身2 タイム差
1 Harzand 0 0
2 US Army Ranger 1 1/2 0.3
3 Idaho 1 1/4 0.55
4 Wings of Desire 5 1.55
5 Humphrey Bogart 3 2.15
6 Red Verdon 1 2.35
7 Algometer 2 2.75
8 Cloth Of Stars 2 3.15
9 Massaat 0 ハナ 3.16
10 Across The Stars 3 3.76
11 Deauville 3 4.36
12 Ulysses 1 1/4 4.61
13 Biodynamic 6 5.81
14 Port Douglas 7 7.21
15 Shogun 7 8.61
16 Moonlight Magic 11 10.81

1つ上の着順との馬身差しか無い時は、自分よりも上の着順の馬身の合計を出して、それを1着馬からのタイム差とする。
みたいな処理が必要になってしまいます。
これをサブクエリ無しで書けるのは本当に便利。

SQL文はシンプルなもんです。

select

tyakujun
,bamei
,basin1
,basin2
,sum(
cast(basin1 as int) * 0.2 +
coalesce( (select sec from m_basin m where m.basin = t.basin2),0)
)
over
(partition by racekey order by tyakujun)

from se t

これをAccessでやろうと思ったら、ウンザリしますわ。

OLAP関数(ウインドウ関数)を使う方が下手なサブクエリを使うよりも最適化されている分処理も早いしね。


see more info at JRDV.sp