Это мой любимый прием 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:=@cnt+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,quote-@quot as change, @quot:=quote curr_quote
from stocks order by company,time) A
order by company,time desc) B where B.LATEST=1;
Вложенность не связана, так что не так плохо (вычислительно), как выглядит (синтаксически) :)
Дайте мне знать, если вам понадобится помощь с этим.
person
Dojo
schedule
03.07.2012
company
? или это переменная? - person Michael Berkowski   schedule 03.07.2012MAX() - MIN()
. Если наcompany
больше 2 строк, все сложнее. - person Michael Berkowski   schedule 03.07.2012