Oracle
 sql >> база данни >  >> RDS >> Oracle

SQL Предизвикателство/Пъзел:Дадено е проследяване на стека - Как да намерите най-горния елемент във всяка точка от времето?

Това е хубав пъзел.

Тъй като основната ми СУБД е Teradata, написах решение за нея с помощта на аналитични функции (нуждае се от 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;

Това решение работи и за Oracle, но PostgreSQL и SQL Server не поддържат IGNORE NULLS опция за LAST_VALUE и емулирането му е доста сложно, например вижте The Last non NULL на Itzk Ben-Gan Пъзел

Редактиране:Всъщност не е толкова сложно, забравих второто решение на Itzik, стария трик с връщане;-)

Подходът на Мартин Смит ще работи и за четирите СУБД.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да заменим lookahead в regex?

  2. Как да изпращате имейл с помощта на Oracle 10 g Forms

  3. Как мога да създам динамична клауза WHERE?

  4. Таблица със заявки с различен списък от променливи, използвайки like

  5. Настройка на Oracle за потребителска схема по подразбиране (без промяна на сесия)