Dit is een mooie puzzel.
Aangezien mijn belangrijkste DBMS Teradata is, heb ik er een oplossing voor geschreven met behulp van analytische functies (heeft TD14.10+ nodig):
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;
Deze oplossing werkt ook voor Oracle, maar PostgreSQL &SQL Server ondersteunen de IGNORE NULLS
niet optie voor LAST_VALUE
en het emuleren ervan is behoorlijk ingewikkeld, zie bijvoorbeeld Itzk Ben-Gan's The Last non NULL Puzzel
Edit:In feite is het niet zo ingewikkeld, ik ben de 2e oplossing van Itzik vergeten, de oude piggyback-truc;-)
De aanpak van Martin Smith werkt voor alle vier de DBMS'en.