Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Simular função de atraso no MySQL


Este é o meu hack MySQL favorito.

É assim que você emula a função lag:
SET @quot=-1;
select time,company,@quot lag_quote, @quot:=quote curr_quote
  from stocks order by company,time;
  • lag_quote mantém o valor da cotação da linha anterior. Para a primeira linha @quot é -1.
  • curr_quote contém o valor da cotação da linha atual.

Notas:
  1. order by cláusula é importante aqui, assim como em uma função regularwindow.
  2. Você também pode usar lag para company apenas para ter certeza de que você está calculando a diferença entre aspas da mesma company .
  3. Você também pode implementar contadores de linha da mesma forma @cnt:[email protected]+1

O bom desse esquema é que é computacionalmente muito enxuto em comparação com algumas outras abordagens, como o uso de funções agregadas, procedimentos armazenados ou processamento de dados no servidor de aplicativos.

EDITAR:

Agora chegando a sua questão de obter resultado no formato que você mencionou:
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;

O aninhamento não é correlacionado, então não é tão ruim (computacionalmente) quanto parece (sintaticamente) :)

Deixe-me saber se você precisar de alguma ajuda com isso.