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

SQL-udfordring/puslespil:Givet et stakspor - Hvordan finder man det øverste element på hvert tidspunkt?

Dette er et fint puslespil.

Da mit primære DBMS er Teradata, skrev jeg en løsning til det ved hjælp af analytiske funktioner (kræver 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;

Denne løsning fungerer også for Oracle, men PostgreSQL og SQL Server understøtter ikke IGNORE NULLS mulighed for LAST_VALUE og efterligning af det er ret kompliceret, se f.eks. Itzk Ben-Gans The Last non NULL Puslespil

Edit:Faktisk er det ikke så komplekst, jeg glemte Itziks 2. løsning, det gamle piggyback-trick;-)

Martin Smiths tilgang vil fungere for alle fire DBMS'er.



  1. Libpuzzle Indeksering af millioner af billeder?

  2. Er der nogen måde at gøre et UNIKT indeks ufølsomt for store og små bogstaver i Mysql 5.1.x?

  3. Bitnami. nulstil mysql root pwd

  4. MariaDB LAST_INSERT_ID() Forklaret