Oracle
 sql >> Datenbank >  >> RDS >> Oracle

SQL Challenge/Puzzle:Angesichts eines Stack-Trace - Wie finde ich das oberste Element zu jedem Zeitpunkt?

Das ist ein schönes Rätsel.

Da mein Haupt-DBMS Teradata ist, habe ich eine Lösung dafür mit analytischen Funktionen geschrieben (benötigt 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;

Diese Lösung funktioniert auch für Oracle, aber PostgreSQL und SQL Server unterstützen die IGNORE NULLS nicht Option für LAST_VALUE und es zu emulieren ist ziemlich kompliziert, siehe z. B. Itzk Ben-Gans The Last non NULL Rätsel

Edit:Eigentlich ist es nicht so komplex, ich habe Itziks 2. Lösung vergessen, den alten Huckepack-Trick;-)

Der Ansatz von Martin Smith funktioniert für alle vier DBMS.