Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Desafio/Quebra-cabeça SQL:Dado um rastreamento de pilha - Como encontrar o elemento superior em cada ponto no tempo?


Este é um bom quebra-cabeça.

Como meu DBMS principal é o Teradata, escrevi uma solução para ele usando funções analíticas (precisa do 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;

Esta solução também funciona para Oracle, mas PostgreSQL e SQL Server não suportam o IGNORE NULLS opção para LAST_VALUE e emulá-lo é bastante complicado, por exemplo, veja The Last non-NULL" de Itzk Ben-Gan Quebra-cabeça

Edit:Na verdade não é tão complexo, esqueci a segunda solução do Itzik, o velho truque das costas;-)

A abordagem de Martin Smith funcionará para todos os quatro SGBDs.