Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Lag-Funktion in MySQL simulieren

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:

  1. order by -Klausel ist hier genauso wichtig wie in einer regulären Fensterfunktion.
  2. Möglicherweise möchten Sie die Verzögerung auch für company verwenden nur um sicherzugehen, dass Sie die Differenz in den Angeboten desselben company berechnen .
  3. 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.