Това е хубав пъзел.
Тъй като основната ми СУБД е Teradata, написах решение за нея с помощта на аналитични функции (нуждае се от TD14.10+):
SELECT dt.*,
-- find the last item in the stack with the same position
Last_Value(val IGNORE NULLS)
Over (PARTITION BY pos
ORDER BY i) AS top_of_stack_val
FROM
(
SELECT st.*,
-- calculate the number of items in the stack
Sum(CASE WHEN op = 'I' THEN 1 ELSE -1 end)
Over (ORDER BY i
ROWS Unbounded Preceding) AS pos
FROM stack_trace AS st
) AS dt;
Това решение работи и за Oracle, но PostgreSQL и SQL Server не поддържат IGNORE NULLS
опция за LAST_VALUE
и емулирането му е доста сложно, например вижте The Last non NULL на Itzk Ben-Gan Пъзел
Редактиране:Всъщност не е толкова сложно, забравих второто решение на Itzik, стария трик с връщане;-)
Подходът на Мартин Смит ще работи и за четирите СУБД.