powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Дерево и сумма узлов
15 сообщений из 15, страница 1 из 1
Дерево и сумма узлов
    #39365252
Igorgg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте. Есть таблица с полями ParentID,NodeID,Weight.
На каждом уровне пишется веса элементов, как найти вес элементов на каждом уровне с учетом иерархии?
То есть, на 1 уровне вес 1 эл. - 5г, на 1 уровне вес 2 эл. - 7г.
На 2 - 10 и 15 соотв.
На 3 - 15,18.
На 4 - 20,25.

Надо, чтобы показывало сумму на каждых уровнях.
Спасибо.
...
Рейтинг: 0 / 0
Дерево и сумма узлов
    #39365253
Igorgg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Необходимо, чтобы еще сумма с учетом уровней считалась.
...
Рейтинг: 0 / 0
Дерево и сумма узлов
    #39365579
Фотография Legushka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Igorgg, просьба приведите ваш пример в виде запроса, что за таблица такая
голову сломал что у вас подразумевается под 1м уровнем (самый маленький эелемент, или самый старший предок), и под весами (в вес входит то что на уровне ниже)

дайте живой пример исходных данных
Код: sql
1.
with temptab(ParentID,NodeID,Weight) as (values (null::int,1::int,5::int),(1,2,6),(1,3,20)...) select * from temptab



и пример таблицы которая должна в итоге получится под эти данные
уровеньсумма115230....420

тогда постановка будет более понятной.
...
Рейтинг: 0 / 0
Дерево и сумма узлов
    #39366149
Igorgg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Решил спасибо.

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;
...
Рейтинг: 0 / 0
Дерево и сумма узлов
    #39366151
Igorgg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
выше опечатался

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;
...
Рейтинг: 0 / 0
Дерево и сумма узлов
    #39366158
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

Спасибо.
...
Рейтинг: 0 / 0
Дерево и сумма узлов
    #39366223
Igorgg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если точнее, то вставить самые последние узлы в уровни выше.
То есть взять узел, и дойти до самого последнего узла, и вставить в узел данные последних узлов - листьев.
...
Рейтинг: 0 / 0
Дерево и сумма узлов
    #39366684
Фотография Legushka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
      1(2)
     /     \
   2(3)   3(4)
   /         \
 4(2)       5(3)


то почему на 3 должно быть 0 а на 2 - 4,5 ?
согласно примеру будет:
на 1 - 4,5
На 2 - 4
На 3 - 5
На 4 - 4
На 5 - 5
наведите порядок у себя, потом спрашивайте
...
Рейтинг: 0 / 0
Дерево и сумма узлов
    #39367168
Igorgg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Все верно. Ошибка была. Смотрел по уровню графа,а не по id. Нужно по Id, как и говорилось. На 2,3-4,5 соответственно
...
Рейтинг: 0 / 0
Дерево и сумма узлов
    #39367241
Igorgg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Получилось для 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
...
Рейтинг: 0 / 0
Дерево и сумма узлов
    #39367243
Igorgg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
немножко этот запрос надо обработать, так как он выводит все дочерние, а не крайние
...
Рейтинг: 0 / 0
Дерево и сумма узлов
    #39367259
Igorgg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Все решил для 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
...
Рейтинг: 0 / 0
Дерево и сумма узлов
    #39367262
Igorgg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот для 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
...
Рейтинг: 0 / 0
Дерево и сумма узлов
    #39367263
Igorgg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ваши комментарии ...
...
Рейтинг: 0 / 0
Дерево и сумма узлов
    #39368336
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IgorggВаши комментарии ...Норм вариант.

Если нужны только id, можно короче через EXCEPT.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
with recursive
t1(id, parent_id, weight) as (
    values (1,0,2), (2,1,3), (3,1,4), (4,2,2), (5,3,3)
),
t2 as (
    select t1.* from t1 where id=1
    union all
    select t1.* from t1 join t2 on t1.parent_id=t2.id
)
select id from t2 
except
select parent_id from t2;


Возможно, на больших объемах LEFT JOIN окажется быстрее, чем IN.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
with recursive
t1(id, parent_id, weight) as (
    values (1,0,2), (2,1,3), (3,1,4), (4,2,2), (5,3,3)
),
t2 as (
    select t1.* from t1 where id=1
    union all
    select t1.* from t1 join t2 on t1.parent_id=t2.id
)
select t2.* from t2 left join t2 as t2a on t2.id = t2a.parent_id where t2a.id is null;
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Дерево и сумма узлов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]