2016年4月4日月曜日

家庭内my株価データベースでマーケットの重複を取り除くSQL文のメモ

家庭内my株価データーベース tmp2というテーブルに
s証券コード
d日付
mマーケット
o,h,l,c 始値、高値、低値、終値
v 出来高

という形式で保存されている。
複合プライマリキーとして(s,d,m)を設定。

で、同じ証券コードの同じ日付に2つのマーケットがあると
エクセルなんかで処理するのが面倒になる。

例えば大阪証券取引所のデータなどが邪魔になる。
別にEXCELやPerlでやるのは難しくないのだが、
出来ればSELECT文で取り除きたいなあ。
要らない条件は、まあ、出来高のでかいヤツがあれば、
それでいいマーケットと考えてよかろー。

(1)同日の同証券コードの最大の出来高を取り出す。
select s,d,max(v) as v from tmp2 group by s,d;
単体だと上みたいなSQL

(2)同日の同証券コードの最大の出来高のマーケットは複数ある可能性がある。この場合、個人で株シミュレーション走らせるだけならどちらを選んでもいいだろうが、どちらかを選ばねばならない。
同日の同証券コードの最大の出来高のマーケットのうち最大のマーケットを選ぶ。
select a.s as s ,a.d as d,max(a.m) as m from tmp2 as a, (1) as b where a.v = b.v group by a.s, a.d

(3)同日の同証券コードの(2)で選んだマーケットの4本値をselectする。
select a.s, a.d, a.m, a.o, a.h, a.l, a.c, a.v from tmp2 as a, (2) as b where a.s = b.s and a.d=b.d and a.m=b.m;

select 
    a.s, a.d, a.m, b.o, b.h, b.l, b.c, b.v
from
    (select b.s as s ,b.d as d,max(b.m) as m 
     from  (select s,d,max(v) as v 
            from tmp2 where s="1332" group by s,d ) as a,
           tmp2 as b 
     where a.s = b.s and a.d=b.d and a.v = b.v
     group by s, d
    ) as a,
    tmp2 as b
where a.s = b.s and a.d=b.d and a.m=b.m;

ぬー。 パワー過ぎ。。。。。。頭が。。。。。。。。。。。。
艦これヤルっす。

where s= "1332"のところを変えて使うみたいな。

こんなんでいいのかな…。
よくわかんないのだが、stock_code を変えるだけで実行できるように
ストアドプロシージャ登録しておいた。
便利だワイ

分割を修正するSQLも考えないとなあ。


0 件のコメント:

コメントを投稿