Исходный код вики Рекурсивная агрегация данных в древовидной структуре
Редактировал(а) Alexandr Fokin 2023/12/16 14:12
Последние авторы
| author | version | line-number | content |
|---|---|---|---|
| 1 | {{code language="sql"}} | ||
| 2 | WITH RECURSIVE r AS ( | ||
| 3 | |||
| 4 | -- Нижний уровень дерева (наиболее отдаленный от корня) | ||
| 5 | SELECT distinct | ||
| 6 | 1 AS i, | ||
| 7 | s.id, | ||
| 8 | s.name, | ||
| 9 | s.parent, | ||
| 10 | --Локальная сумма (на текущем уровне) | ||
| 11 | sum(COALESCE (t.sum, 0)) | ||
| 12 | over (PARTITION by s.id) | ||
| 13 | as localSum, | ||
| 14 | -- Глобальная сумма (агрегирует локальную сумму и сумму подуровне) | ||
| 15 | sum(COALESCE (t.sum, 0)) | ||
| 16 | over (PARTITION by s.id) | ||
| 17 | as globalSum | ||
| 18 | from storage s | ||
| 19 | left join transaction t | ||
| 20 | on s.id = t.storage | ||
| 21 | where | ||
| 22 | s.id not in | ||
| 23 | ( | ||
| 24 | select s2.parent | ||
| 25 | from storage s2 | ||
| 26 | where s2.parent is not null | ||
| 27 | ) | ||
| 28 | UNION | ||
| 29 | |||
| 30 | -- Последующий уровень вверх | ||
| 31 | SELECT distinct | ||
| 32 | i+1 AS i, | ||
| 33 | s.id, | ||
| 34 | s.name, | ||
| 35 | s.parent, | ||
| 36 | --Локальная сумма (на текущем уровне) | ||
| 37 | sum(COALESCE (t.sum, 0)) | ||
| 38 | over (PARTITION by s.id) | ||
| 39 | as localSum, | ||
| 40 | -- Глобальная сумма (агрегирует локальную сумму и сумму подуровне) | ||
| 41 | sum(COALESCE (t.sum, 0) + r.globalSum) | ||
| 42 | over (PARTITION by s.id) | ||
| 43 | as globalSum | ||
| 44 | FROM storage s | ||
| 45 | join r | ||
| 46 | on r.parent = s.id | ||
| 47 | left join transaction t | ||
| 48 | on s.id = t.storage | ||
| 49 | ) | ||
| 50 | |||
| 51 | |||
| 52 | SELECT | ||
| 53 | r.* | ||
| 54 | FROM r | ||
| 55 | order by r.id | ||
| 56 | {{/code}} | ||
| 57 | |||
| 58 | ---- | ||
| 59 | |||
| 60 | |||
| 61 | Aggregate functions are not allowed in a recursive query. Is there an alternative way to write this query? | ||
| 62 | https://stackoverflow.com/questions/57299663/aggregate-functions-are-not-allowed-in-a-recursive-query-is-there-an-alternativ |