Este é um bom quebra-cabeça.
Como meu DBMS principal é o Teradata, escrevi uma solução para ele usando funções analíticas (precisa do 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;
Esta solução também funciona para Oracle, mas PostgreSQL e SQL Server não suportam o
IGNORE NULLS
opção para LAST_VALUE
e emulá-lo é bastante complicado, por exemplo, veja The Last non-NULL" de Itzk Ben-Gan Quebra-cabeça
Edit:Na verdade não é tão complexo, esqueci a segunda solução do Itzik, o velho truque das costas;-)
A abordagem de Martin Smith funcionará para todos os quatro SGBDs.