Questo è il mio hack MySQL preferito.
Ecco come emulare la funzione di ritardo:
SET @quot=-1;
select time,company,@quot lag_quote, @quot:=quote curr_quote
from stocks order by company,time;
lag_quote
contiene il valore della citazione della riga precedente. Per la prima riga @quot è -1.curr_quote
contiene il valore della quotazione della riga corrente.
Note:
order by
La clausola è importante qui proprio come in una funzione regularwindow.- Potresti anche utilizzare il ritardo per
company
solo per essere sicuro di calcolare la differenza tra virgolette della stessacompany
. - Puoi anche implementare i contatori di righe nello stesso modo
@cnt:[email protected]+1
La cosa bella di questo schema è che è molto snello dal punto di vista computazionale rispetto ad altri approcci come l'utilizzo di funzioni aggregate, stored procedure o elaborazione di dati nel server delle applicazioni.
EDIT:
Veniamo ora alla tua domanda su come ottenere risultati nel formato che hai menzionato:
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;
La nidificazione non è correlata, quindi non è così negativa (dal punto di vista computazionale) come sembra (sintatticamente) :)
Fammi sapere se hai bisogno di aiuto con questo.