By using db<>fiddle, you agree to license everything you submit by Creative Commons CC0.
CREATE TABLE parent (`id` INTEGER, `value` DECIMAL(10, 2));
INSERT INTO parent (`id`, `value`) VALUES
('1', '10.00'), ('2', '20.00');
CREATE TABLE children (`id` INTEGER, `parent_id` INTEGER, `multiple` DECIMAL(10, 2), `sum` DECIMAL(10, 2));
INSERT INTO children (`id`, `parent_id`, `multiple`, `sum`) VALUES
('1', '1', '1.00', '1.00'), ('2', '1', '1.00', '1.00'), ('3', '1', '1.00', '1.00'), ('4', '2', '2.00', '2.00'), ('5', '2', '2.00', '2.00');
Records: 2 Duplicates: 0 Warnings: 0
Records: 5 Duplicates: 0 Warnings: 0
WITH
cte_children AS (SELECT *, ROW_NUMBER() OVER (PARTITION BY parent_id ORDER BY id) rn FROM children),
cte_sums AS (
SELECT p.id,
c.rn,
POW(c.multiple, c.rn) * p.value + SUM(POW(c.multiple, c.rn)) OVER (PARTITION BY p.id ORDER BY c.rn) * c.sum value
FROM parent p INNER JOIN cte_children c
ON c.parent_id = p.id
)
SELECT DISTINCT id,
FIRST_VALUE(value) OVER (PARTITION BY id ORDER BY rn DESC) value
FROM cte_sums;
id | value |
---|---|
1 | 13 |
2 | 92 |