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_quoteenthält den Wert des Zitats der vorherigen Zeile. Für die erste Zeile ist @quot -1.curr_quoteenthä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
companyverwenden nur um sicherzugehen, dass Sie die Differenz in den Angeboten desselbencompanyberechnen . - Auf dieselbe Weise können Sie auch Zeilenzähler implementieren
@cnt:example@sqldat.com+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,example@sqldat.com 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.