C'est un joli casse-tête.
Comme mon SGBD principal est Teradata, j'ai écrit une solution en utilisant des fonctions analytiques (nécessite 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;
Cette solution fonctionne également pour Oracle, mais PostgreSQL et SQL Server ne prennent pas en charge le IGNORE NULLS
option pour LAST_VALUE
et l'émuler est assez compliqué, par exemple voir Itzk Ben-Gan The Last non NULL Casse-tête
Edit :En fait ce n'est pas si complexe, j'ai oublié la 2ème solution d'Itzik, le vieux tour de ferroutage;-)
L'approche de Martin Smith fonctionnera pour les quatre SGBD.