sql >> Base de Datos >  >> RDS >> Mysql

Simular la función de retraso en MySQL

Este es mi truco MySQL favorito.

Así es como emulas la función de retraso:

SET @quot=-1;
select time,company,@quot lag_quote, @quot:=quote curr_quote
  from stocks order by company,time;
  • lag_quote contiene el valor de la cotización de la fila anterior. Para la primera fila @quot es -1.
  • curr_quote contiene el valor de la cotización de la fila actual.

Notas:

  1. order by La cláusula es importante aquí como lo es en una función de ventana regular.
  2. Es posible que también desee utilizar el retraso para company solo para asegurarse de que está calculando la diferencia en cotizaciones de la misma company .
  3. También puede implementar contadores de filas de la misma manera @cnt:[email protected]+1

Lo bueno de este esquema es que es muy simple desde el punto de vista computacional en comparación con otros enfoques, como el uso de funciones agregadas, procedimientos almacenados o el procesamiento de datos en el servidor de aplicaciones.

EDITAR:

Ahora, volviendo a su pregunta sobre cómo obtener el resultado en el formato que mencionó:

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;

El anidamiento no está relacionado, por lo que no es tan malo (computacionalmente) como parece (sintácticamente) :)

Avísame si necesitas ayuda con esto.