Oracle
 sql >> Base de données >  >> RDS >> Oracle

Défi/Puzzle SQL :Étant donné une trace de pile - Comment trouver l'élément supérieur à chaque instant ?

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.