To fajna łamigłówka.
Ponieważ moim głównym DBMS jest Teradata, napisałem dla niego rozwiązanie za pomocą funkcji analitycznych (wymaga 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;
To rozwiązanie działa również dla Oracle, ale PostgreSQL i SQL Server nie obsługują IGNORE NULLS
opcja dla LAST_VALUE
a emulacja jest dość skomplikowana, np. patrz The Last non NULL Układanka
Edycja:W rzeczywistości nie jest to takie skomplikowane, zapomniałem o drugim rozwiązaniu Itzika, starej sztuczce na barana;-)
Podejście Martina Smitha będzie działać dla wszystkich czterech DBMS.