sql >> Database >  >> RDS >> Oracle

SQL-uitdaging/puzzel:een stacktracering gegeven - Hoe het bovenste element op elk tijdstip te vinden?

Dit is een mooie puzzel.

Aangezien mijn belangrijkste DBMS Teradata is, heb ik er een oplossing voor geschreven met behulp van analytische functies (heeft TD14.10+ nodig):

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;

Deze oplossing werkt ook voor Oracle, maar PostgreSQL &SQL Server ondersteunen de IGNORE NULLS niet optie voor LAST_VALUE en het emuleren ervan is behoorlijk ingewikkeld, zie bijvoorbeeld Itzk Ben-Gan's The Last non NULL Puzzel

Edit:In feite is het niet zo ingewikkeld, ik ben de 2e oplossing van Itzik vergeten, de oude piggyback-truc;-)

De aanpak van Martin Smith werkt voor alle vier de DBMS'en.



  1. Hoe kan ik prefixen in alle tabellen in mijn MySQL DB wijzigen?

  2. Beste databasesoftware voor ontwikkelaars (2022-editie)

  3. Postgresql SELECTEER als string bevat

  4. Hoe kies je geoptimaliseerde datatypes voor kolommen [innodb-specifiek]?