Рекурсивный запрос - Рекурсивная агрегация данных в древовидной структуре 

Page / - Изменено Alexandr Fokin в 2023/12/16 14:12 

Рекурсивная агрегация данных в древовидной структуре 
Изменено Alexandr Fokin
в 2023/12/16 14:12

Оглавление

WITH RECURSIVE r AS (

-- Нижний уровень дерева (наиболее отдаленный от корня)
SELECT distinct
 1 AS i, 
  s.id,
  s.name,
  s.parent,
 --Локальная сумма (на текущем уровне)
 sum(COALESCE (t.sum, 0)) 
   over (PARTITION by s.id) 
  as localSum,
 -- Глобальная сумма (агрегирует локальную сумму и сумму подуровне)
 sum(COALESCE (t.sum, 0)) 
   over (PARTITION by s.id) 
  as globalSum
from storage s
 left join transaction t 
  on s.id = t.storage 
where 
  s.id not in
  (
  select s2.parent
  from storage s2
  where s2.parent is not null
  )
UNION 

-- Последующий уровень вверх
SELECT distinct
  i+1 AS i, 
  s.id,
  s.name,
  s.parent,
 --Локальная сумма (на текущем уровне)
 sum(COALESCE (t.sum, 0)) 
   over (PARTITION by s.id) 
  as localSum,
 -- Глобальная сумма (агрегирует локальную сумму и сумму подуровне)
 sum(COALESCE (t.sum, 0) + r.globalSum)
   over (PARTITION by s.id) 
  as globalSum
FROM storage s
 join r
  on r.parent = s.id
 left join transaction t 
  on s.id = t.storage
)

SELECT 
 r.*
FROM r
order by r.id

Aggregate functions are not allowed in a recursive query. Is there an alternative way to write this query?
https://stackoverflow.com/questions/57299663/aggregate-functions-are-not-allowed-in-a-recursive-query-is-there-an-alternativ