Как реализовать LAG и FIRST_VALUE в MySql в старой версии?
LAG() over(order by order_field):
select x, @lag as LagX, @lag:=x
from ...
order by order_field
Значение поля x сохраняется в переменной и в следующей строке выборки (при заданной сортировке) оно сохранит свое значение до выполнения нового присваивания, т.е. при использовании в предыдущих элементах списка выборки.
Для эмуляции предложения over(partition by partition_filed) используется дополнительная переменная для определения момента смены группы.
select x, if(@partition=partition_field, @lag, NULL) as LagX,
@partition:=partition_field, @lag:=x
...
order by parition_filed, order_field
FIRST_VALUE() реализуется практически таким же if, как и lag() over(partition by partition_filed). Необходимо запоминать новое значение для переменной только в том случае если группа текущей строки не совпадает с группой предыдущей. При сохраняющейся группе переменной присваивается она сама, т.е. ее значение не изменяется:
select x, @lag as first_value, @lag:=if(@partition=partition_field, @lag, x),
@partition:=partition_field
order by parition_filed, order_field
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости