Това е любимият ми хак за MySQL.
Ето как емулирате функцията за забавяне:
SET @quot=-1;
select time,company,@quot lag_quote, @quot:=quote curr_quote
from stocks order by company,time;
lag_quote
съдържа стойността на котировката на предишния ред. За първия ред @quot е -1.curr_quote
съдържа стойността на котировката на текущия ред.
Бележки:
order by
клаузата е важна тук, точно както е в обикновена функция на прозореца.- Може да искате да използвате изоставане за
company
само за да сте сигурни, че изчислявате разликата в котировките на една и същаcompany
. - Можете също да внедрите броячи на редове по същия начин
@cnt:[email protected]+1
Хубавото на тази схема е, че изчислително е много слаб в сравнение с някои други подходи като използване на агрегатни функции, съхранени процедури или обработка на данни в сървъра на приложения.
РЕДАКТИРАНЕ:
Сега стигаме до въпроса ви за получаване на резултат във формата, който споменахте:
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;
Влагането не е съвместно свързано, така че не е толкова лошо (изчислително), колкото изглежда (синтактично) :)
Кажете ми, ако имате нужда от помощ за това.