Oracle
 sql >> Baza danych >  >> RDS >> Oracle

SQL Challenge/Puzzle:Biorąc pod uwagę ślad stosu - Jak znaleźć najwyższy element w każdym momencie?

To fajna łamigłówka.

Ponieważ moim głównym DBMS jest Teradata, napisałem dla niego rozwiązanie za pomocą funkcji analitycznych (wymaga 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;

To rozwiązanie działa również dla Oracle, ale PostgreSQL i SQL Server nie obsługują IGNORE NULLS opcja dla LAST_VALUE a emulacja jest dość skomplikowana, np. patrz The Last non NULL Układanka

Edycja:W rzeczywistości nie jest to takie skomplikowane, zapomniałem o drugim rozwiązaniu Itzika, starej sztuczce na barana;-)

Podejście Martina Smitha będzie działać dla wszystkich czterech DBMS.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle 11G - Efekt wydajności indeksowania przy wstawianiu

  2. błąd podczas wstawiania wielu wierszy w sql

  3. Dostęp nieodszyfrowany Oracle Transparent Data Encryption

  4. Oracle SQL - Jak uzyskać odrębną liczbę dla każdej kolumny dynamicznie?

  5. Zabranie rekordu z maksymalną datą