Det här är ett trevligt pussel.
Eftersom min huvudsakliga DBMS är Teradata skrev jag en lösning för det med hjälp av analytiska funktioner (behö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;
Denna lösning fungerar också för Oracle, men PostgreSQL och SQL Server stöder inte IGNORE NULLS
alternativ för LAST_VALUE
och att emulera det är ganska komplicerat, se t.ex. Itzk Ben-Gans The Last non NULL Pussel
Edit:Det är faktiskt inte så komplicerat, jag glömde Itziks andra lösning, det gamla piggyback-tricket;-)
Martin Smiths tillvägagångssätt kommer att fungera för alla fyra DBMS.