sql >> Databáze >  >> RDS >> Oracle

SQL Challenge/Puzzle:Daná stopa zásobníku – Jak najít horní prvek v každém okamžiku?

To je pěkná hádanka.

Protože mým hlavním DBMS je Teradata, napsal jsem pro něj řešení pomocí analytických funkcí (potřebuje 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;

Toto řešení funguje i pro Oracle, ale PostgreSQL a SQL Server nepodporují IGNORE NULLS možnost pro LAST_VALUE a jeho emulace je poměrně komplikovaná, např. viz Itzk Ben-Gan's The Last non NULL Hádanka

Edit:Ve skutečnosti to není tak složité, zapomněl jsem na Itzikovo 2. řešení, starý trik na zádech;-)

Přístup Martina Smitha bude fungovat pro všechny čtyři DBMS.



  1. Zabezpečujete přípravu výpisů vaši databázi?

  2. Jak nastavit název tabulky v dynamickém SQL dotazu?

  3. Microsoft Access vs SQL Server

  4. Získání výsledků Mysql bez znalosti názvu sloupce