2017-02-15 1 views
-1

Ich versuche, eine Abfrage zu führen, um meine Tabelle zu aktualisieren, um eine prozentuale Änderung von 10 Zeilen zu berechnen (nach der Überprüfung, dass vor 10 Zeilen in der gleichen Kategorie wie die aktuelle Zeile ist). Dies ist der Code, den ich verwende.UPDATE gibt andere Ergebnisse als 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; 

Es läuft ohne Fehler, aber alle aktualisierten Werte identisch sind (in meinem Fall 0,2625). Wenn ich eine Abfrage mit SELECT statt UPDATE ausführe (ohne etwas anderes zu ändern), bekomme ich die gewünschte Ausgabe.

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; 

Der erste Wert in der Spalte, wenn die percentchange10 SELECT verwendet, ist 0,2625, so dass er jede Zeile mit dem ersten Ergebnis zu aktualisieren, anstatt passenden jede Zeile zu sein scheint. Das gewünschte Ergebnis besteht darin, jede Zeile in xstocks mit der entsprechenden Zeile aus dem Ergebnis der SELECT-Abfrage zu aktualisieren.

+0

Als Nebenbemerkung (nicht eng mit der Frage verbunden), habe ich keine formelle Ausbildung in SQL, so dass ich (noch) nicht vollständig die Reihenfolge einer UPDATE-Abfrage verstehen. Ich vermute, das hat etwas mit dem Problem zu tun, aber ich habe keinen konkreten Grund, dies zu vermuten, außer meinem Mangel an Wissen darüber. –

+0

Es gibt etwas strukturell falsch mit Ihrem Schema, wenn Sie eine solche Anfrage schreiben müssen. Haben Sie die [Null, eine oder Unendlichkeitsregel] (http://en.wikipedia.org/wiki/Zero_one_infinity_rule) von [Datenbanknormalisierung] (http://en.wikipedia.org/wiki/Database_normalization) verletzt? – tadman

+0

Ich nehme an, Sie könnten sagen, dass dies redundante Daten erzeugen würde (weil ich die Daten immer neu berechnen könnte, wann immer ich sie benötigte), aber ansonsten habe ich sie nicht verletzt. Der Grund für alle Variablen besteht darin, die Verzögerungsfunktion zu simulieren, um zu vermeiden, dass alle 1.000.000 Zeilen in der Tabelle verbunden werden müssen. –

Antwort

0

Das Anhängen mit WHERE xstocks.id = src.id ergibt die gewünschte Ausgabe (zumindest auf einer kleinen, 70.000 Zeilen langen Tabelle, die für längere Abfragen verwendet wird).

Verwandte Themen