Mysql
 sql >> Database >  >> RDS >> Mysql

Simula la funzione di ritardo in MySQL

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:

  1. order by La clausola è importante qui proprio come in una funzione regularwindow.
  2. Potresti anche utilizzare il ritardo per company solo per essere sicuro di calcolare la differenza tra virgolette della stessa company .
  3. 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.