Oracle
 sql >> Database >  >> RDS >> Oracle

Sfida/puzzle SQL:data una traccia dello stack:come trovare l'elemento principale in ogni momento?

Questo è un bel puzzle.

Poiché il mio DBMS principale è Teradata, ho scritto una soluzione utilizzando le funzioni analitiche (richiede 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;

Questa soluzione funziona anche per Oracle, ma PostgreSQL e SQL Server non supportano IGNORE NULLS opzione per LAST_VALUE ed emularlo è piuttosto complicato, ad esempio vedi The Last non NULL di Itzk Ben-Gan Puzzle

Modifica:in realtà non è così complesso, ho dimenticato la seconda soluzione di Itzik, il vecchio trucco sulle spalle;-)

L'approccio di Martin Smith funzionerà per tutti e quattro i DBMS.