Das ist mein Lieblings-MySQL-Hack.
So emulieren Sie die Lag-Funktion:
SET @quot=-1;
select time,company,@quot lag_quote, @quot:=quote curr_quote
from stocks order by company,time;
lag_quote
enthält den Wert des Zitats der vorherigen Zeile. Für die erste Zeile ist @quot -1.curr_quote
enthält den Wert des Zitats der aktuellen Zeile.
Hinweise:
order by
-Klausel ist hier genauso wichtig wie in einer regulären Fensterfunktion.- Möglicherweise möchten Sie die Verzögerung auch für
company
verwenden nur um sicherzugehen, dass Sie die Differenz in den Angeboten desselbencompany
berechnen . - Auf dieselbe Weise können Sie auch Zeilenzähler implementieren
@cnt:[email protected]+1
Das Schöne an diesem Schema ist, dass es im Vergleich zu einigen anderen Ansätzen wie der Verwendung von Aggregatfunktionen, gespeicherten Prozeduren oder der Verarbeitung von Daten in einem Anwendungsserver rechnerisch sehr schlank ist.
BEARBEITEN:
Kommen wir nun zu Ihrer Frage, ob Sie ein Ergebnis in dem von Ihnen erwähnten Format erhalten möchten:
SET @quot=0,@latest=0,company='';
select B.* from (
select A.time,A.change,IF(@comp<>A.company,1,0) as LATEST,@comp:=A.company as company from (
select time,company,[email protected] as change, @quot:=quote curr_quote
from stocks order by company,time) A
order by company,time desc) B where B.LATEST=1;
Die Verschachtelung ist nicht miteinander verknüpft, also nicht so schlimm (rechnerisch), wie es (syntaktisch) aussieht :)
Lassen Sie mich wissen, wenn Sie dabei Hilfe benötigen.