Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 2 [3]      все
 Re: Отсортировать (в кавычках) взвешенный граф. Возможно ли это на TSQL?  [new]
uaggster
Member

Откуда:
Сообщений: 724
aleks222
uaggster
aleks222, А где его взять, идентификатор то?
Для того, чтобы сгенерировать идентификатор, нужно определить все ноды, которые в него входят.
Ну, т.е. определить сам граф, в куче других.
Вот эти ноды - один граф, вот эти - другой.
А как это сделать?


Элементарно, Ватсон.
declare @graph table (parent bigint not NULL, child bigint not NULL, [weight] int not NULL, gID bigint, primary key(parent, child, [weight]), unique(child, parent, [weight]) );

insert into @graph(parent, child, [weight])
Values 
-- 1 граф
(1, 1, 1), (1, 2, 1), (1, 3, 10), (2, 3, 2), (3, 1, 3), (3, 6, 1), (6, 6, 2)
-- 2 граф
, (4, 4, 1), (4, 5, 1), (5, 4, 2), (5, 4, 1);

with t as ( select *, n = row_number() over( order by 1/0 ) from @graph )
  update t set gID = n from t;

declare @rc int = 1;

while @rc > 0 begin

  with t as ( select * from @graph )
     update t set gID = t1.gID
	   from t inner join t as t1 on t.child = t1.parent
	   where t.gID > t1.gID 
  ;
  set @rc = @@ROWCOUNT;

  with t as ( select * from @graph )
     update t set gID = t1.gID
	   from t inner join t as t1 on t1.child = t.parent
	   where t.gID > t1.gID 
  ;
  set @rc = @rc + @@ROWCOUNT;

  with t as ( select * from @graph )
     update t set gID = t1.gID
	   from t inner join t as t1 on t1.child = t.child
	   where t.gID > t1.gID 
  ;
  set @rc = @rc + @@ROWCOUNT;

  with t as ( select * from @graph )
     update t set gID = t1.gID
	   from t inner join t as t1 on t1.parent = t.parent
	   where t.gID > t1.gID 
  ;
  set @rc = @rc + @@ROWCOUNT;

end;

select * from @graph order by gID;

select gID, max([weight]) from @graph group by gID

Это получается пузырьковая сортировка что-ли?
Офигеть.
Понял. Наверное даже смогу воспроизвести с закрытыми глазами.

А почему
with t as ( select * from @graph )
?
Просто:
     update t set gID = t1.gID
	   from @graph t inner join @graph as t1 on t1.parent = t.parent
	   where t.gID > t1.gID 

Нельзя??
Нет, я понимаю, что можно, но может есть смысл какой-то, для табличных переменных или еще чего? В плане в упор никаких различий не нашел!
10 июл 19, 14:58    [21924231]     Ответить | Цитировать Сообщить модератору
 Re: Отсортировать (в кавычках) взвешенный граф. Возможно ли это на TSQL?  [new]
aleks222
Member

Откуда:
Сообщений: 754
uaggster
А почему
with t as ( select * from @graph )
?

Это только личные предпочтения.
В остальном - пофиг.
10 июл 19, 18:56    [21924395]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 2 [3]      все
Все форумы / Microsoft SQL Server Ответить