Вы не игнорируете значения NULL
, поэтому ваш исходный код для меня выглядит как lead()
:
lead(my_table.my_col) over (partition by my_table.my_col2, my_table.my_col3
order by my_table.my_col4
)
Рамка окна не требуется. Это должно работать в обеих базах данных.
EDIT:
@ dnoeth правильно. Это сложная формулировка. Похоже, что logi c помещает последнее значение столбца для всех строк, которые не разделяют окончательное значение. Это кажется странным, но эквивалентно этой формулировке:
first_value(my_table.my_col) over (partition by my_table.my_col2, my_table.my_col3
order by my_table.my_col4 desc
)
Разница в том, что это всегда выбирает последнее значение в столбце. Указанный код возвращает NULL
для самого последнего значения. Итак, может потребоваться case
:
(case when rank() over (partition by my_table.my_col2, my_table.my_col3
order by my_table.my_col4 desc) > 1
then first_value(my_table.my_col) over (partition by my_table.my_col2, my_table.my_col3
order by my_table.my_col4 desc
)
end)
Здесь - скрипт db <>, использующий Postgres, который принимает оба запроса.