Toto je můj oblíbený hack MySQL.
Takto emulujete funkci zpoždění:
SET @quot=-1;
select time,company,@quot lag_quote, @quot:=quote curr_quote
from stocks order by company,time;
lag_quote
obsahuje hodnotu nabídky předchozího řádku. Pro první řádek je @quot -1.curr_quote
obsahuje hodnotu aktuálního řádku.
Poznámky:
order by
klauzule je zde důležitá stejně jako ve funkci regularwindow.- Pro
company
můžete také použít prodlevu jen pro jistotu, že počítáte rozdíl v uvozovkách stejnécompany
. - Stejným způsobem můžete také implementovat čítače řádků
@cnt:[email protected]+1
Pěkná věc na tomto schématu je, že je výpočetně velmi nenáročný ve srovnání s některými jinými přístupy, jako je použití agregovaných funkcí, uložených procedur nebo zpracování dat na aplikačním serveru.
EDIT:
Nyní se dostáváme k vaší otázce získání výsledku ve formátu, který jste zmínili:
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;
Vnoření spolu nesouvisí, takže není tak špatné (výpočetně), jak to vypadá (syntakticky) :)
Dejte mi vědět, pokud s tím potřebujete pomoc.