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:
order by
La cláusula es importante aquí como lo es en una función de ventana regular.- Es posible que también desee utilizar el retraso para
company
solo para asegurarse de que está calculando la diferencia en cotizaciones de la mismacompany
. - 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.