To mój ulubiony hack MySQL.
W ten sposób emulujesz funkcję opóźnienia:
SET @quot=-1;
select time,company,@quot lag_quote, @quot:=quote curr_quote
from stocks order by company,time;
lag_quote
przechowuje wartość cytatu z poprzedniego wiersza. Dla pierwszego wiersza @quot wynosi -1.curr_quote
przechowuje wartość cytatu z bieżącego wiersza.
Uwagi:
order by
klauzula jest tutaj ważna, tak jak w funkcji zwykłego okna.- Możesz także użyć opóźnienia dla
company
żeby mieć pewność, że obliczasz różnicę w wycenach tej samejcompany
. - Możesz również zaimplementować liczniki wierszy w ten sam sposób
@cnt:[email protected]+1
Zaletą tego schematu jest to, że jest on bardzo oszczędny obliczeniowo w porównaniu z niektórymi innymi podejściami, takimi jak używanie funkcji agregujących, procedur składowanych lub przetwarzanie danych na serwerze aplikacji.
EDYCJA:
Teraz przechodzę do pytania o uzyskanie wyniku we wspomnianym formacie:
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;
Zagnieżdżanie nie jest ze sobą powiązane, więc nie jest tak złe (obliczeniowo), jak wygląda (syntaktycznie) :)
Daj mi znać, jeśli potrzebujesz pomocy.