У меня есть 2 столбца - номер заказа, значение. Конструктор значений таблицы:
(1, null)
,(2, 5)
,(3, null)
,(4, null)
,(5, 2)
,(6, 1)
Мне нужно получить
(1, 5) -- i.e. first nonnull Value if I go from current row and order by OrderNo
,(2, 5)
,(3, 2) -- i.e. first nonnull Value if I go from current row and order by OrderNo
,(4, 2) -- analogous
,(5, 2)
,(6, 1)
Это запрос, который, я думаю, должен работать.
;with SourceTable as (
select *
from (values
(1, null)
,(2, 5)
,(3, null)
,(4, null)
,(5, 2)
,(6, 1)
) as T(OrderNo, Value)
)
select
*
,first_value(Value) over (
order by
case when Value is not null then 0 else 1 end
, OrderNo
rows between current row and unbounded following
) as X
from SourceTable
order by OrderNo
Проблема в том, что он возвращаетточно такой же набор результатов как SourceTable. Я не понимаю почему. Например, если первая строка обработана (OrderNo = 1), я ожидаю, что столбец X вернет 5, потому что frame должен включать все строки (текущая строка и несвязанные последующие), и он упорядочивается по Value - сначала не по нулям, а затем по OrderNo. Таким образом, первая строка в кадре должна быть OrderNo = 2. Очевидно, что это не так, но я не понимаю, почему.
Очень признателен, если кто-то объяснит, как устроен первый кадр. Мне нужно это для SQL Server, а также Postgresql.
Большое спасибо