To je pěkná hádanka.
Protože mým hlavním DBMS je Teradata, napsal jsem pro něj řešení pomocí analytických funkcí (potřebuje 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;
Toto řešení funguje i pro Oracle, ale PostgreSQL a SQL Server nepodporují IGNORE NULLS
možnost pro LAST_VALUE
a jeho emulace je poměrně komplikovaná, např. viz Itzk Ben-Gan's The Last non NULL Hádanka
Edit:Ve skutečnosti to není tak složité, zapomněl jsem na Itzikovo 2. řešení, starý trik na zádech;-)
Přístup Martina Smitha bude fungovat pro všechny čtyři DBMS.