Я думаю, что вам не хватает PARTITION. Кроме того, LAG отлично, но если вы просто делаете тип промежуточного итога, SUM с небольшим количеством вычислений будет хорошо. Во-первых, вам понадобится идентификатор в ваших исходных данных; повторяющиеся столбцы испортят его.
with source (ORDER_id, ARTICLE, COLOR , SIZE, STOCK, NEEDED) as
(
select 43002, 1000 , 'GREY ', 'L ' , 13 , 4 union all
select 43002, 1000 , 'GREY ', 'XL' , 20 , 5 union all
select 43006, 1000 , 'GREY ', 'XL' , 20 , 4 union all
select 43012, 1000 , 'GREY ', 'XL' , 20 , 6 union all
select 43021, 1000 , 'GREY ', 'XL' , 20 , 2 union all
select 43021, 1000 , 'PURPLE', 'M ' , 7 , 2 union all
select 43023, 1000 , 'PURPLE', 'L ' , 6 , 3
)
select id, order_id, article, color, size, stock, NEEDED, stock + needed - sum(needed) over (partition by ARTICLE, COLOR, SIZE order by id)
from (
select row_number() over (order by order_id) id, ORDER_id, ARTICLE, COLOR, SIZE, STOCK, NEEDED
from source
) source_with_id