2017-02-15 12 views
-1

10行前(10行前が現在の行と同じカテゴリにあることを確認した後)のパーセント変化を計算するためにテーブルを更新するクエリを実行しようとしています。これは私が使用しているコードです。UPDATEはSELECTと異なる結果を示しています

update xstocks, 
(select date,symbol,o10,open,(open-o10)/o10 percentchange10 from (
select date,@s10 s10,@o10 o10,@s10:=s9 s9,@o10:=o9 o9,@s9:=s8 s8,@o9:=o8 o8,@s8:=s7 s7,@o8:=o7 o7,@s7:=s6 s6,@o7:=o6 o6,@s6:=s5 s5,@o6:=o5 o5,@s5:=s4 s4,@o5:=o4 o4,@s4:=s3 s3,@o4:=o3 o3,@s3:=s2 s2,@o3:=o2 o2,@s2:=s1 s1,@o2:=o1 o1,symbol, open from(
select date,@s9 s9,@o9 o9,@s9:=s8 s8,@o9:=o8 o8,@s8:=s7 s7,@o8:=o7 o7,@s7:=s6 s6,@o7:=o6 o6,@s6:=s5 s5,@o6:=o5 o5,@s5:=s4 s4,@o5:=o4 o4,@s4:=s3 s3,@o4:=o3 o3,@s3:=s2 s2,@o3:=o2 o2,@s2:=s1 s1,@o2:=o1 o1,symbol, open from(
select date,@s8 s8,@o8 o8,@s8:=s7 s7,@o8:=o7 o7,@s7:=s6 s6,@o7:=o6 o6,@s6:=s5 s5,@o6:=o5 o5,@s5:=s4 s4,@o5:=o4 o4,@s4:=s3 s3,@o4:=o3 o3,@s3:=s2 s2,@o3:=o2 o2,@s2:=s1 s1,@o2:=o1 o1,symbol, open from(
select date,@s7 s7,@o7 o7,@s7:=s6 s6,@o7:=o6 o6,@s6:=s5 s5,@o6:=o5 o5,@s5:=s4 s4,@o5:=o4 o4,@s4:=s3 s3,@o4:=o3 o3,@s3:=s2 s2,@o3:=o2 o2,@s2:=s1 s1,@o2:=o1 o1,symbol, open from(
select date,@s6 s6,@o6 o6,@s6:=s5 s5,@o6:=o5 o5,@s5:=s4 s4,@o5:=o4 o4,@s4:=s3 s3,@o4:=o3 o3,@s3:=s2 s2,@o3:=o2 o2,@s2:=s1 s1,@o2:=o1 o1,symbol, open from(
select date,@s5 s5,@o5 o5,@s5:=s4 s4,@o5:=o4 o4,@s4:=s3 s3,@o4:=o3 o3,@s3:=s2 s2,@o3:=o2 o2,@s2:=s1 s1,@o2:=o1 o1,symbol, open from(
select date,@s4 s4,@o4 o4,@s4:=s3 s3,@o4:=o3 o3,@s3:=s2 s2,@o3:=o2 o2,@s2:=s1 s1,@o2:=o1 o1,symbol, open from(
select date,@s3 s3,@o3 o3,@s3:=s2 s2,@o3:=o2 o2,@s2:=s1 s1,@o2:=o1 o1,symbol, open from(
select date,@s2 s2,@o2 o2,@s2:=s1 s1,@o2:=o1 o1,symbol, open from(
select date,@s1 s1,@o1 o1,@s1:=symbol symbol, @o1:=open open 
from xstocks order by symbol,date 
) sub1 
) sub2 
) sub3 
) sub4 
) sub5 
) sub6 
) sub7 
) sub8 
) sub9 
) sub10 
where s10 = symbol) src 
set xstocks.percentchange10 = src.percentchange10; 

これはエラーなしで実行されますが、すべての更新値は同じです(私の場合は0.2625)。 UPDATEの代わりにSELECTを使ってクエリを実行すると(何も変更せずに)、目的の出力が得られます。それが最初の結果ですべての行を更新するのではなく、それぞれの行に一致しているように見えるよう

select * from 
(select date,symbol,o10,open,(open-o10)/o10 percentchange10 from (
select date,@s10 s10,@o10 o10,@s10:=s9 s9,@o10:=o9 o9,@s9:=s8 s8,@o9:=o8 o8,@s8:=s7 s7,@o8:=o7 o7,@s7:=s6 s6,@o7:=o6 o6,@s6:=s5 s5,@o6:=o5 o5,@s5:=s4 s4,@o5:=o4 o4,@s4:=s3 s3,@o4:=o3 o3,@s3:=s2 s2,@o3:=o2 o2,@s2:=s1 s1,@o2:=o1 o1,symbol, open from(
select date,@s9 s9,@o9 o9,@s9:=s8 s8,@o9:=o8 o8,@s8:=s7 s7,@o8:=o7 o7,@s7:=s6 s6,@o7:=o6 o6,@s6:=s5 s5,@o6:=o5 o5,@s5:=s4 s4,@o5:=o4 o4,@s4:=s3 s3,@o4:=o3 o3,@s3:=s2 s2,@o3:=o2 o2,@s2:=s1 s1,@o2:=o1 o1,symbol, open from(
select date,@s8 s8,@o8 o8,@s8:=s7 s7,@o8:=o7 o7,@s7:=s6 s6,@o7:=o6 o6,@s6:=s5 s5,@o6:=o5 o5,@s5:=s4 s4,@o5:=o4 o4,@s4:=s3 s3,@o4:=o3 o3,@s3:=s2 s2,@o3:=o2 o2,@s2:=s1 s1,@o2:=o1 o1,symbol, open from(
select date,@s7 s7,@o7 o7,@s7:=s6 s6,@o7:=o6 o6,@s6:=s5 s5,@o6:=o5 o5,@s5:=s4 s4,@o5:=o4 o4,@s4:=s3 s3,@o4:=o3 o3,@s3:=s2 s2,@o3:=o2 o2,@s2:=s1 s1,@o2:=o1 o1,symbol, open from(
select date,@s6 s6,@o6 o6,@s6:=s5 s5,@o6:=o5 o5,@s5:=s4 s4,@o5:=o4 o4,@s4:=s3 s3,@o4:=o3 o3,@s3:=s2 s2,@o3:=o2 o2,@s2:=s1 s1,@o2:=o1 o1,symbol, open from(
select date,@s5 s5,@o5 o5,@s5:=s4 s4,@o5:=o4 o4,@s4:=s3 s3,@o4:=o3 o3,@s3:=s2 s2,@o3:=o2 o2,@s2:=s1 s1,@o2:=o1 o1,symbol, open from(
select date,@s4 s4,@o4 o4,@s4:=s3 s3,@o4:=o3 o3,@s3:=s2 s2,@o3:=o2 o2,@s2:=s1 s1,@o2:=o1 o1,symbol, open from(
select date,@s3 s3,@o3 o3,@s3:=s2 s2,@o3:=o2 o2,@s2:=s1 s1,@o2:=o1 o1,symbol, open from(
select date,@s2 s2,@o2 o2,@s2:=s1 s1,@o2:=o1 o1,symbol, open from(
select date,@s1 s1,@o1 o1,@s1:=symbol symbol, @o1:=open open 
from xstocks order by symbol,date 
) sub1 
) sub2 
) sub3 
) sub4 
) sub5 
) sub6 
) sub7 
) sub8 
) sub9 
) sub10 
where s10 = symbol) src; 

SELECTを用いpercentchange10列の最初の値は、0.2625です。望ましい結果は、xstocksの各行をSELECTクエリの結果から対応する行に更新することです。

+0

質問に厳密に関係していないので、私はSQLで正式なトレーニングをしていないので、私は(まだ)UPDATEクエリのシーケンスを完全に理解していません。私はこれが問題と関係していると考えていますが、それに関する知識が不足していること以外は疑う余地はありません。 –

+0

このような特異なクエリを書く必要がある場合は、スキーマに構造的に問題があります。 [データベースの正規化](http://en.wikipedia.org/wiki/Database_normalization)の[ゼロ、1つまたは無限のルール](http://en.wikipedia.org/wiki/Zero_one_infinity_rule)に違反しましたか? – tadman

+0

私は、これが冗長データを作成していると言えるでしょう。なぜなら、いつでもデータを再計算することができるからです。すべての変数の理由は、ラグ関数をシミュレートして、テーブル内の1,000,000以上のすべての行を結合する必要がないためです。 –

答えて

0

WHERE xstocks.id = src.idを付けると、少なくとも長いクエリをテストするために使用される小さな70,000行のテーブルで、望ましい出力が得られます。

関連する問題