Ésta es mi favorito MySQL hackear.
Esta es la forma de emular la función de retardo:
SET @quot=-1;
select time,company,@quot lag_quote, @quot:=quote curr_quote
from stocks order by company,time;
lag_quote
mantiene el valor de cotización de la fila anterior. Para la primera fila @quot es -1.
curr_quote
contiene el valor de la cita de la fila actual.
Notas:
order by
cláusula es importante en este caso al igual que lo es en una función regular ventana.
- Es posible que también desee utilizar lag para
company
solo para asegurarse de que está calculando la diferencia en las comillas de la misma company
.
- También puede implementar contadores de fila de la misma manera
@cnt:[email protected]+1
Lo bueno de este sistema es que es computacionalmente muy magra en comparación con algunos otros enfoques como el uso de las funciones de agregado, procedimientos almacenados o procesamiento de datos en el servidor de aplicaciones .
EDIT:
Ahora que se acerca a su pregunta de conseguir resultado en el formato que usted ha mencionado:
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á co relacionado con lo que no es tan malo (computacionalmente) como se ve (sintácticamente) :)
Avíseme si necesita ayuda con esto.
¿Hay solo dos por 'compañía'? o es variable? –
estas son dos compañías – javanx
Veo que tiene dos compañías aquí, ¿pero hay solo dos filas por compañía? Si es así, puede usar los agregados 'MAX() - MIN()' trivialmente. Si hay más de 2 filas por 'compañía', es más complicado. –