sql >> Databasteknik >  >> RDS >> Mysql

Simulera fördröjningsfunktion i MySQL

Detta är mitt favorit MySQL-hack.

Så här emulerar du fördröjningsfunktionen:

SET @quot=-1;
select time,company,@quot lag_quote, @quot:=quote curr_quote
  from stocks order by company,time;
  • lag_quote innehåller värdet av föregående rads citat. För den första raden är @quot -1.
  • curr_quote innehåller värdet av nuvarande rads citat.

Anmärkningar:

  1. order by klausul är viktig här precis som i en vanlig fönsterfunktion.
  2. Du kanske också vill använda fördröjning för company bara för att vara säker på att du beräknar skillnaden i citattecken för samma company .
  3. Du kan också implementera radräknare på samma sätt @cnt:[email protected]+1

Det fina med det här schemat är att det är beräkningsmässigt väldigt magert jämfört med vissa andra tillvägagångssätt som att använda aggregerade funktioner, lagrade procedurer eller bearbetning av data i applikationsservern.

EDIT:

Nu kommer till din fråga om att få resultat i formatet du nämnde:

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;

Häckningen är inte samrelaterad så inte så dålig (beräkningsmässigt) som den ser ut (syntaktisk) :)

Låt mig veta om du behöver hjälp med detta.



  1. MySQL LN() Funktion – Returnera den naturliga logaritmen för ett tal

  2. Förstå vikten av minnesinställning i SQL Server

  3. PostgreSQL visuella gränssnitt som liknar phpMyAdmin?

  4. Batch Mode Bitmaps i SQL Server