Реализация LAG и FIRST_VALUE в MySql

123
13 апреля 2019, 08:20

Как реализовать LAG и FIRST_VALUE в MySql в старой версии?

Answer 1

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
READ ALSO
Система имён пользователей сайта

Система имён пользователей сайта

Возникла задача реализации поиска пользователей по имени, фамилииНо

130
Как проверить наличие заглавных букв?

Как проверить наличие заглавных букв?

Надо найти все записи в столбце таблицы которые содержат заглавные буквыСтолбец текстовый (varchar)

161
MySQL взаимодействие таблиц

MySQL взаимодействие таблиц

Как я могу организовать такое действие: если поле A пользователя 246 в поле idPage в таблице tab1 = NULL, а в таблице tab2 есть есть этот id, то поле A = 'True'

215
Как сделать шар (не круг)?

Как сделать шар (не круг)?

подскажите как сделать шар по средством css, чтобы на нем можно было поставить цифру, например шар номер 3,

155