January 20, 2012

oracle / fold

Вопрос: есть ли в оракле что-то типа fold?
Например задача, сэмулировать SUM без использования самого SUM.

Т.е. изначально была идея использовать SELECT ID, B, DECODE(LAG(D).. , NULL, B, B+LAG(D).. ) AS D FROM... , но оракл таких рекурсий не разрешает: ORA-00904: "D": invalid identifier

С SUM решение выглядит так:

SELECT ID, B, SUM(B) OVER (ORDER BY ID)
FROM (
  SELECT 1 AS ID, 100 AS B FROM DUAL
  UNION SELECT 2 AS ID, 50 AS B FROM DUAL
  UNION SELECT 3 AS ID, 200 AS B FROM DUAL
)
ORDER BY ID

Так как быть без SUM?