Questo è un bel puzzle.
Poiché il mio DBMS principale è Teradata, ho scritto una soluzione utilizzando le funzioni analitiche (richiede 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;
Questa soluzione funziona anche per Oracle, ma PostgreSQL e SQL Server non supportano IGNORE NULLS
opzione per LAST_VALUE
ed emularlo è piuttosto complicato, ad esempio vedi The Last non NULL di Itzk Ben-Gan Puzzle
Modifica:in realtà non è così complesso, ho dimenticato la seconda soluzione di Itzik, il vecchio trucco sulle spalle;-)
L'approccio di Martin Smith funzionerà per tutti e quattro i DBMS.