Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Дерево и сумма узлов
|
|||
|---|---|---|---|
|
#18+
Здравствуйте. Есть таблица с полями ParentID,NodeID,Weight. На каждом уровне пишется веса элементов, как найти вес элементов на каждом уровне с учетом иерархии? То есть, на 1 уровне вес 1 эл. - 5г, на 1 уровне вес 2 эл. - 7г. На 2 - 10 и 15 соотв. На 3 - 15,18. На 4 - 20,25. Надо, чтобы показывало сумму на каждых уровнях. Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2016, 20:28 |
|
||
|
Дерево и сумма узлов
|
|||
|---|---|---|---|
|
#18+
Необходимо, чтобы еще сумма с учетом уровней считалась. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2016, 20:30 |
|
||
|
Дерево и сумма узлов
|
|||
|---|---|---|---|
|
#18+
Igorgg, просьба приведите ваш пример в виде запроса, что за таблица такая голову сломал что у вас подразумевается под 1м уровнем (самый маленький эелемент, или самый старший предок), и под весами (в вес входит то что на уровне ниже) дайте живой пример исходных данных Код: sql 1. и пример таблицы которая должна в итоге получится под эти данные уровеньсумма115230....420 тогда постановка будет более понятной. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2016, 11:54 |
|
||
|
Дерево и сумма узлов
|
|||
|---|---|---|---|
|
#18+
Решил спасибо. WITH RECURSIVE children AS ( SELECT id, weight, parent_id FROM igg.demos t WHERE task IS NOT NULL UNION ALL SELECT t.id, children.weight, t.parent_id FROM children JOIN igg.demos t ON children.parent_id = t.id ) SELECT id, sum(weight) FROM children GROUP BY id ORDER BY id; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2016, 20:17 |
|
||
|
Дерево и сумма узлов
|
|||
|---|---|---|---|
|
#18+
выше опечатался WITH RECURSIVE children AS ( SELECT id, weight, parent_id FROM igg.demos t WHERE weight IS NOT NULL UNION ALL SELECT t.id, children.weight, t.parent_id FROM children JOIN igg.demos t ON children.parent_id = t.id ) SELECT id, sum(weight) FROM children GROUP BY id ORDER BY id; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2016, 20:17 |
|
||
|
Дерево и сумма узлов
|
|||
|---|---|---|---|
|
#18+
Теперь еще вопрос: как вывести все листья на каждом зависимом уровне? Например, ID, ParentID,Weight 1,0,2 2,1,3 3,1,4 4,2,2 5,3,3 Нужно, чтобы на 1 - были 4,5 На 2 - 4, 5 На 3 - 0 На 4 - 4 На 5 - 5 Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2016, 20:22 |
|
||
|
Дерево и сумма узлов
|
|||
|---|---|---|---|
|
#18+
Если точнее, то вставить самые последние узлы в уровни выше. То есть взять узел, и дойти до самого последнего узла, и вставить в узел данные последних узлов - листьев. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2016, 21:50 |
|
||
|
Дерево и сумма узлов
|
|||
|---|---|---|---|
|
#18+
IgorggНапример, ID, ParentID,Weight 1,0,2 2,1,3 3,1,4 4,2,2 5,3,3 Нужно, чтобы на 1 - были 4,5 На 2 - 4, 5 На 3 - 0 На 4 - 4 На 5 - 5 на вашем примере решение совсем не соответствует вашему дереву если нарисовать это дерево (в скобкам указанный вес): Код: sql 1. 2. 3. 4. 5. то почему на 3 должно быть 0 а на 2 - 4,5 ? согласно примеру будет: на 1 - 4,5 На 2 - 4 На 3 - 5 На 4 - 4 На 5 - 5 наведите порядок у себя, потом спрашивайте ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2016, 13:18 |
|
||
|
Дерево и сумма узлов
|
|||
|---|---|---|---|
|
#18+
Все верно. Ошибка была. Смотрел по уровню графа,а не по id. Нужно по Id, как и говорилось. На 2,3-4,5 соответственно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2016, 19:29 |
|
||
|
Дерево и сумма узлов
|
|||
|---|---|---|---|
|
#18+
Получилось для mssql. Для postgresql пока нет. ;WITH cte AS ( SELECT a.Id, a.parent_Id, a.Id as t1 FROM demos a UNION ALL SELECT b.Id, b.parent_id,c.t1 FROM demos b INNER JOIN cte c ON b.parent_Id = c.id ) SELECT * FROM cte order by t1 asc ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2016, 22:41 |
|
||
|
Дерево и сумма узлов
|
|||
|---|---|---|---|
|
#18+
немножко этот запрос надо обработать, так как он выводит все дочерние, а не крайние ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2016, 22:47 |
|
||
|
Дерево и сумма узлов
|
|||
|---|---|---|---|
|
#18+
Все решил для mssql, для postgre - позже WITH cte AS ( SELECT a.Id, a.parent_Id, a.Id as t1 FROM demos a UNION ALL SELECT b.Id, b.parent_id,c.t1 FROM demos b INNER JOIN cte c ON b.parent_Id = c.id ) SELECT DISTINCT * FROM cte where ID not in (Select xx.Parent_ID from cte xx where xx.t1 = t1) order by t1 asc ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2016, 23:28 |
|
||
|
Дерево и сумма узлов
|
|||
|---|---|---|---|
|
#18+
Вот для postgre WITH RECURSIVE children (id, task, parent_id,t1) AS ( SELECT id, task, parent_id, id FROM igg.demos UNION ALL SELECT c.id, c.task, c.parent_id, p.t1 FROM igg.demos c JOIN children p ON p.id = c.parent_id ) SELECT DISTINCT * FROM children where ID not in (Select xx.Parent_ID from children xx where xx.t1 = t1) order by t1,id asc ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2016, 23:39 |
|
||
|
Дерево и сумма узлов
|
|||
|---|---|---|---|
|
#18+
Ваши комментарии ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2016, 23:39 |
|
||
|
Дерево и сумма узлов
|
|||
|---|---|---|---|
|
#18+
IgorggВаши комментарии ...Норм вариант. Если нужны только id, можно короче через EXCEPT. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Возможно, на больших объемах LEFT JOIN окажется быстрее, чем IN. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2016, 10:09 |
|
||
|
|

start [/forum/topic.php?fid=53&tid=1996812]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
166ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
44ms |
get tp. blocked users: |
1ms |
| others: | 293ms |
| total: | 546ms |

| 0 / 0 |
