У меня есть интересная проблема с SQL. У меня есть иерархическая таблица деталей, которые составляют спецификацию материалов. похоже на это:
ASSEMBLY
---------
parent_part_id
part_id
quantity
Я получаю иерархию этой структуры с помощью такого запроса:
SELECT level, part_id, quantity
from assembly
start with parent_part_id = 1
connect by parent_part_id = prior part_id;
вывод может выглядеть так:
level part_id quantity
----- ------- ---------
1 2 2
2 3 10
1 4 2
2 5 1
3 3 5
Все идет нормально.
вопрос в следующем: как рассчитать общее количество каждой детали, необходимой для сборки верхнего уровня (деталь 1)?
Группировать этот результирующий набор по деталям и суммировать количество некорректно, так как количество должно умножаться на количество детали непосредственно над текущей деталью в иерархии, рекурсивно вверх по дереву.
Я думаю, что это функция LAG, но не могу ее визуализировать.
редактировать: ожидаемые результаты:
part_id quantity
------- --------
2 2
3 30
4 2
5 2
больше редактирования: я получаю интересные результаты с этим запросом
SELECT rownum, level lvl, part_id, quantity, unit_of_measure
, connect_by_isleaf || sys_connect_by_path(quantity,'*') math
from assembly
start with parent_part_id = 1
connect by parent_part_id = prior part_id
столбец math возвращает строковое представление вычисления, которое я хочу выполнить :) например, он может сказать:
1*1*2*10
или что-то подобное и подходящее ... возможно, создание функции для анализа этого и возврата результата решит проблему ... кто-нибудь думает, что это возмутительно?