Dette er et fint puslespil.
Da mit primære DBMS er Teradata, skrev jeg en løsning til det ved hjælp af analytiske funktioner (kræver 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;
Denne løsning fungerer også for Oracle, men PostgreSQL og SQL Server understøtter ikke IGNORE NULLS
mulighed for LAST_VALUE
og efterligning af det er ret kompliceret, se f.eks. Itzk Ben-Gans The Last non NULL Puslespil
Edit:Faktisk er det ikke så komplekst, jeg glemte Itziks 2. løsning, det gamle piggyback-trick;-)
Martin Smiths tilgang vil fungere for alle fire DBMS'er.