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

Откуда:
Сообщений: 724
Коллеги, приветствую!
Есть задача, к которой даже не знаю, с какой стороны подступиться, весь мозг сломал.
Имеется таблица, содержащая набор произвольных графов.
Графы в т.ч. - содержат петли.
Необходимо "размотать" граф, и "вытащить" его за самый тяжелый узел.

Create table graph (parent bigint not NULL, child bigint not NULL, [weight] int not NULL)

insert into graph
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)

На выходе нужно получить:
parent child
1 1
1 2
1 3
1 6
5 5
5 4

Граф представлен как совокупность нод: узел -> смежный узел -> вес узла.
Преобразовать его нужно, "Навесив" все достижимые узлы на узел, имеющий максимальный вес в каком либо из состояний.
Т.е., в первом графе максимальный вес имеет узел 1, см. (1, 3, 10), это вес 10.
Поэтому он считается "главным", а остальные достижимые узлы, в т.ч. - он сам - его дочерними.
Обратите внимание, что сам граф - имеет петли, а узел №6 - непосредственно из узла №1 - недостижим (но достижим через другие узлы).
Второй граф имеет самый "массивный" узел (5, 4, 2), 5 имеет вес 2, остальные состояния - только вес 1, поэтому он и считается главным.

Это не совсем взвешенный граф, но так получилось.
Собственно, меня устроит любое решение, не обязательно "Одним запросом".

В таблице - множество графов.
Но если не получится преобразовать ее целиком, меня устроит решение, когда на вход подается нода, например parent = 1, а на выходе возвращается такая "матрица смежности" (это не матрица смежности, я понимаю, но тем не менее).
... я тогда курсором переберу все, объем небольшой, пара миллионов вхождений всего.

Может ли облегчить задачу тот факт, что нод в любом из графов - заведомо не более 100?
Если кандидатов на самую массивную ноду в графе - несколько, то нужно выбрать одну и только одну главную ноду произвольно.
28 июн 19, 09:40    [21916755]     Ответить | Цитировать Сообщить модератору
 Re: Отсортировать (в кавычках) взвешенный граф. Возможно ли это на TSQL?  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3147
В тему

SQL Graph Architecture

https://docs.microsoft.com/en-us/sql/relational-databases/graphs/sql-graph-architecture?view=sql-server-2017
28 июн 19, 10:17    [21916780]     Ответить | Цитировать Сообщить модератору
 Re: Отсортировать (в кавычках) взвешенный граф. Возможно ли это на TSQL?  [new]
uaggster
Member

Откуда:
Сообщений: 724
Блин, у меня 2016SP2.
Сейчас поставлю триал 2017. Хотя нужно вкуривать новую для себя концепцию.
Чисто реляционного решения никто не знает?

Фактически, как я понимаю, нужна функция, которая по номеру ноды вернет список всех достижимых из нее узлов, с весами.
Всё осложняется произвольными петлями в графе.
28 июн 19, 10:33    [21916811]     Ответить | Цитировать Сообщить модератору
 Re: Отсортировать (в кавычках) взвешенный граф. Возможно ли это на TSQL?  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3147
uaggster
Блин, у меня 2016SP2.
Сейчас поставлю триал 2017. Хотя нужно вкуривать новую для себя концепцию.
Чисто реляционного решения никто не знает?

Фактически, как я понимаю, нужна функция, которая по номеру ноды вернет список всех достижимых из нее узлов, с весами.
Всё осложняется произвольными петлями в графе.


Решение есть, я просто дал ссылку на тип данных,который уже сделан майкрософтом, может быть его использование поможет.
Вы же версию сервера не указали.
Кроме того, есть тип HierarchyID, для работы с иерархиями, это так, к слову.
28 июн 19, 10:41    [21916819]     Ответить | Цитировать Сообщить модератору
 Re: Отсортировать (в кавычках) взвешенный граф. Возможно ли это на TSQL?  [new]
uaggster
Member

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

Откуда:
Сообщений: 754
uaggster
Блин, у меня 2016SP2.
Сейчас поставлю триал 2017. Хотя нужно вкуривать новую для себя концепцию.
Чисто реляционного решения никто не знает?

Фактически, как я понимаю, нужна функция, которая по номеру ноды вернет список всех достижимых из нее узлов, с весами.
Всё осложняется произвольными петлями в графе.


1. Добавь в табличку поле: ID_graph - идентификатор графа
2. Заполни.
3. Все станет тривиальным.
28 июн 19, 12:58    [21916967]     Ответить | Цитировать Сообщить модератору
 Re: Отсортировать (в кавычках) взвешенный граф. Возможно ли это на TSQL?  [new]
uaggster
Member

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

Откуда:
Сообщений: 11490
-- 2 граф
(4, 4, 1), (4, 5, 1), (5, 4, 2), (5, 4, 1)


что-то странный граф. если верхушка от 4, то почему там 5, 4 варианты попали?
28 июн 19, 13:16    [21916986]     Ответить | Цитировать Сообщить модератору
 Re: Отсортировать (в кавычках) взвешенный граф. Возможно ли это на TSQL?  [new]
uaggster
Member

Откуда:
Сообщений: 724
Konst_One
-- 2 граф
(4, 4, 1), (4, 5, 1), (5, 4, 2), (5, 4, 1)


что-то странный граф. если верхушка от 4, то почему там 5, 4 варианты попали?

Это не дерево. А граф общего вида. Нет у него верхушки.
А ноды - перечислены, как перечислены.
(5, 4, 2), (5, 4, 1) - да, перечислена дважды. Но вес "ситуации" - разный.
(4, 4, 1) - да, нода указывает на саму себя.
(4, 5, 1), (5, 4, 2), (5, 4, 1) - да, две ноды взаимно указывают друг на друга, причем нода 4 указывает на ноду 5 - один раз, а нода 5 на ноду 4 - дважды, имея при этом разные веса (можно трактовать как вес ребра).
28 июн 19, 13:31    [21917011]     Ответить | Цитировать Сообщить модератору
 Re: Отсортировать (в кавычках) взвешенный граф. Возможно ли это на TSQL?  [new]
Konst_One
Member

Откуда:
Сообщений: 11490
graph (parent bigint not NULL, child bigint not NULL

как так? у вас сполошное закольцовывание, это замкнутый граф. и другие графы ваши сложно определяемы, так как нет ограничений на "раскрутку", это задача без лимитов и ограничений не решаема.

4,4
4,5
5,4
5,5
28 июн 19, 13:36    [21917020]     Ответить | Цитировать Сообщить модератору
 Re: Отсортировать (в кавычках) взвешенный граф. Возможно ли это на TSQL?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 6936
uaggster,

имо эта задача решается рекурсивными алгоритмами и не с помощью T-SQL.
28 июн 19, 13:38    [21917022]     Ответить | Цитировать Сообщить модератору
 Re: Отсортировать (в кавычках) взвешенный граф. Возможно ли это на TSQL?  [new]
uaggster
Member

Откуда:
Сообщений: 724
Konst_One
graph (parent bigint not NULL, child bigint not NULL

как так? у вас сполошное закольцовывание, это замкнутый граф. и другие графы ваши сложно определяемы, так как нет ограничений на "раскрутку", это задача без лимитов и ограничений не решаема.

4,4
4,5
5,4
5,5

Ну вот такие графы :-(

Ограничение есть. В каждом конкретном графе - заведомо меньше 100 нод.
Точнее даже не нод, а записей вида (4, 4, 1), описывающих связь.
28 июн 19, 14:04    [21917055]     Ответить | Цитировать Сообщить модератору
 Re: Отсортировать (в кавычках) взвешенный граф. Возможно ли это на TSQL?  [new]
iap
Member

Откуда: Москва
Сообщений: 46881
Чтобы не зациклиться, надо организовать поле в рекурсивном CTE, в котором накапливать список пройденных узлов,
чтобы не проходить узел дважды.
28 июн 19, 15:10    [21917128]     Ответить | Цитировать Сообщить модератору
 Re: Отсортировать (в кавычках) взвешенный граф. Возможно ли это на TSQL?  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 3994
uaggster,

Сделайте обход вашего дерева-графа по принципу левый - корень - правый с помощью рекурсии и полученный линейный спиcок пробейте NTILE.

Функция NTile(2) порежет ваш список примерно пополам без всяких долгих гемороев.

https://docs.microsoft.com/ru-RU/sql/t-sql/functions/ntile-transact-sql?view=sql-server-2017
28 июн 19, 15:41    [21917151]     Ответить | Цитировать Сообщить модератору
 Re: Отсортировать (в кавычках) взвешенный граф. Возможно ли это на TSQL?  [new]
court
Member

Откуда:
Сообщений: 1829
a_voronin
Функция NTile(2) порежет ваш список примерно пополам без всяких долгих гемороев.
ему не нужно "пополам"
Нужно найти несвязанные подграфы
28 июн 19, 15:47    [21917158]     Ответить | Цитировать Сообщить модератору
 Re: Отсортировать (в кавычках) взвешенный граф. Возможно ли это на TSQL?  [new]
uaggster
Member

Откуда:
Сообщений: 724
Вот что мне нужно, как я понимаю: SHORTEST_PATH
https://docs.microsoft.com/ru-ru/sql/relational-databases/graphs/sql-graph-shortest-path?view=sqlallproducts-allversions&viewFallbackFrom=sql-server-2017
Но оно, сцуко, доступно только с 2019.
28 июн 19, 16:41    [21917201]     Ответить | Цитировать Сообщить модератору
 Re: Отсортировать (в кавычках) взвешенный граф. Возможно ли это на TSQL?  [new]
court
Member

Откуда:
Сообщений: 1829
uaggster
Вот что мне нужно, как я понимаю: SHORTEST_PATH
https://docs.microsoft.com/ru-ru/sql/relational-databases/graphs/sql-graph-shortest-path?view=sqlallproducts-allversions&viewFallbackFrom=sql-server-2017
Но оно, сцуко, доступно только с 2019.
Картинка с другого сайта.
автор
Функция SHORTEST_PATH позволяет найти:
Кратчайший путь между двумя заданные узлы/сущности
Единый источник кратчайшего пути.
Кратчайшего пути из нескольких узлов источника для нескольких целевых узлов.

и что это тебе даст ?
вот тебе возможные пути в графе, - что дальше ? :)
Как из этого, "по-простому" определить, что у тебя 2-а подграфа, и уже в них (в 2-х) искать максимальное ребро ... ?

;with cte as (
	select
		start_node  =parent
		,node		=child
		,[path]		=cast('/'+cast(parent as varchar(10))+'/'+cast(child as varchar(10))+'/' as varchar(max))
	from graph 
	where parent<>child

	union all

	select 
		cte.start_node
		,node	=t.child
		,[path]	=cast(cte.[path]+cast(t.child as varchar(10))+'/' as varchar(max))
	from graph t inner join cte on t.parent=cte.node
	where cte.[path] not like '%/'+cast(t.child as varchar(10))+'/%'
)

select 
	* 
from cte  
order by 1


start_nodenodepath
12/1/2/
13/1/3/
16/1/3/6/
13/1/2/3/
16/1/2/3/6/
21/2/3/1/
26/2/3/6/
23/2/3/
31/3/1/
36/3/6/
32/3/1/2/
45/4/5/
54/5/4/
54/5/4/
28 июн 19, 17:16    [21917230]     Ответить | Цитировать Сообщить модератору
 Re: Отсортировать (в кавычках) взвешенный граф. Возможно ли это на TSQL?  [new]
invm
Member

Откуда: Москва
Сообщений: 8838
drop table if exists #t;

declare @g table (parent bigint not NULL, child bigint not NULL, [weight] int not NULL);

insert into @g
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 g as
(
 select
  parent as root, parent, child, '/' + cast(parent as varchar(max)) as [path]
 from
  @g

 union all

 select
  g.root, c.parent, c.child, g.[path] + p.[path]
 from
  g join
  @g c on c.parent = g.child cross apply
  (select '/' + cast(c.parent as varchar(10))) p([path])
 where
  g.[path] + '/' not like '%' + p.[path] + '/%'
)
select root, parent, child, [path] + '/' as [path] into #t from g;

with s as
(
 select
  a.root, string_agg(a.child, '/') within group (order by a.child) as graph_id
 from
  (select distinct root, child from #t) a
 group by
  a.root
),
w as
(
 select
  s.*, row_number() over (partition by s.graph_id order by g.weight desc) as rn
 from
  s join
  @g g on g.parent = s.root
)
select distinct
 w.root, t.child
from
 w join
 #t t on t.root = w.root
where
 w.rn = 1
order by
 w.root;
28 июн 19, 19:10    [21917298]     Ответить | Цитировать Сообщить модератору
 Re: Отсортировать (в кавычках) взвешенный граф. Возможно ли это на TSQL?  [new]
aleks222
Member

Откуда:
Сообщений: 754
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
28 июн 19, 19:59    [21917319]     Ответить | Цитировать Сообщить модератору
 Re: Отсортировать (в кавычках) взвешенный граф. Возможно ли это на TSQL?  [new]
Сруль.
Member

Откуда:
Сообщений: 113
Для начала в таблицу графа, я добавил номер графа.
Разбираться, где заканчивается один граф и начинается второй,
отдельная диссертация-не уму ни сердцу.


--Подготовка данных
Create table graph (parent bigint not NULL, child bigint not NULL, [weight] int not NULL,graph_id int)
go
insert into graph
Values
-- 1 граф
(1, 1, 1,1), (1, 2, 1,1), (1, 3, 10,1), (2, 3, 2,1), (3, 1, 3,1), (3, 6, 1,1), (6, 6, 2,1)
-- 2 граф
insert into graph
Values
(4, 4, 1,2), (4, 5, 1,2), (5, 4, 2,2), (5, 4, 1,2)
go
select * from graph
1 июл 19, 18:36    [21918447]     Ответить | Цитировать Сообщить модератору
 Re: Отсортировать (в кавычках) взвешенный граф. Возможно ли это на TSQL?  [new]
Сруль.
Member

Откуда:
Сообщений: 113
Второе действие, понадобяться вспомогательные таблицы, не временные,
а вспомогательные.
if OBJECT_ID('t_node_sequence') is not null
drop table t_node_sequence
go
if OBJECT_ID('t_node_sequence') is  null
create table t_node_sequence
(parent bigint not NULL, child bigint not NULL, graph_id int)
go
if OBJECT_ID('t_single_graph') is not null
drop table t_single_graph
go
create  table t_single_graph
(parent bigint not NULL, child bigint not NULL, [weight] int not NULL,graph_id int)
go
1 июл 19, 18:39    [21918451]     Ответить | Цитировать Сообщить модератору
 Re: Отсортировать (в кавычках) взвешенный граф. Возможно ли это на TSQL?  [new]
Сруль.
Member

Откуда:
Сообщений: 113
Теперь две процедуры. Одна.
create proc p_first_node(@graph_id int)
as
begin


insert into t_node_sequence
(parent,child,graph_id)
select top 1 parent,child,graph_id
from graph
where 
[weight]=(select max([weight]) from graph where @graph_id=graph_id)
and graph_id=@graph_id

delete t
from t_single_graph t,t_node_sequence t1
where t.parent=t1.parent  and t.child=t1.child
and t.graph_id=@graph_id

return
end
1 июл 19, 18:42    [21918454]     Ответить | Цитировать Сообщить модератору
 Re: Отсортировать (в кавычках) взвешенный граф. Возможно ли это на TSQL?  [new]
Сруль.
Member

Откуда:
Сообщений: 113
Вторая.
--------------------------------------------------------------------------------------------------
create proc p_next_node(@new_parent int,@graph_id int)
as
begin
declare @parent int, @child int

if 
not exists(select * from t_single_graph where @graph_id=graph_id and @new_parent=parent
and parent<>child)
return

select top 1
@parent=parent, @child=child
from t_single_graph
where @new_parent=parent and @graph_id=graph_id
and parent<>child


insert into t_node_sequence
(parent,child,graph_id)
select @new_parent,@child,@graph_id

delete t_single_graph
where parent=@parent  and @child=child

set @new_parent=@child
exec p_next_node @new_parent ,@graph_id 
return
end
1 июл 19, 18:43    [21918455]     Ответить | Цитировать Сообщить модератору
 Re: Отсортировать (в кавычках) взвешенный граф. Возможно ли это на TSQL?  [new]
Сруль.
Member

Откуда:
Сообщений: 113
Теперь скрипт для первого графа, хард-кодный параметр 1

if OBJECT_ID('t_node_sequence') is not null
drop table t_node_sequence
go
if OBJECT_ID('t_node_sequence') is  null
create table t_node_sequence
(parent bigint not NULL, child bigint not NULL, graph_id int)
go
if OBJECT_ID('t_single_graph') is not null
drop table t_single_graph
go
create  table t_single_graph
(parent bigint not NULL, child bigint not NULL, [weight] int not NULL,graph_id int)
go
--=====================================================
insert into t_single_graph
select * from graph where graph_id=1
--=====================================================
declare @new_parent int
exec p_first_node 1
select @new_parent=child from t_node_sequence
--select @new_parent
 
 exec p_next_node @new_parent,1
 

insert into t_node_sequence --напоследок загоняем петли
(parent,child,graph_id)
 select parent,child,graph_id
 from graph
where graph_id=1 
 and parent=child
 
 select * from t_node_sequence
 order by parent,child
1 июл 19, 18:45    [21918457]     Ответить | Цитировать Сообщить модератору
 Re: Отсортировать (в кавычках) взвешенный граф. Возможно ли это на TSQL?  [new]
Сруль.
Member

Откуда:
Сообщений: 113
Скрипт для второго графа, хард-кодный параметр 2

if OBJECT_ID('t_node_sequence') is not null
drop table t_node_sequence
go
if OBJECT_ID('t_node_sequence') is  null
create table t_node_sequence
(parent bigint not NULL, child bigint not NULL, graph_id int)
go
if OBJECT_ID('t_single_graph') is not null
drop table t_single_graph
go
create  table t_single_graph
(parent bigint not NULL, child bigint not NULL, [weight] int not NULL,graph_id int)
go
--=====================================================
insert into t_single_graph
select * from graph where graph_id=2
--=====================================================
declare @new_parent int
exec p_first_node 2
select @new_parent=child from t_node_sequence
--select @new_parent
 
 exec p_next_node @new_parent,2
 
insert into t_node_sequence --напоследок загоняем петли
(parent,child,graph_id)
 select parent,child,graph_id
 from graph
where graph_id=2 
 and parent=child
 
 select * from t_node_sequence
 order by parent,child
1 июл 19, 18:47    [21918458]     Ответить | Цитировать Сообщить модератору
 Re: Отсортировать (в кавычках) взвешенный граф. Возможно ли это на TSQL?  [new]
Сруль.
Member

Откуда:
Сообщений: 113
Ну и соответственно выходы, первый

К сообщению приложен файл. Размер - 16Kb
1 июл 19, 18:50    [21918461]     Ответить | Цитировать Сообщить модератору
 Re: Отсортировать (в кавычках) взвешенный граф. Возможно ли это на TSQL?  [new]
Сруль.
Member

Откуда:
Сообщений: 113
И второй

К сообщению приложен файл. Размер - 12Kb
1 июл 19, 18:51    [21918462]     Ответить | Цитировать Сообщить модератору
 Re: Отсортировать (в кавычках) взвешенный граф. Возможно ли это на TSQL?  [new]
Сруль.
Member

Откуда:
Сообщений: 113
В комманду занесения петлей, поставьте дистинкт, что-то она щедрая, а копать неохота.
1 июл 19, 18:59    [21918467]     Ответить | Цитировать Сообщить модератору
 Re: Отсортировать (в кавычках) взвешенный граф. Возможно ли это на TSQL?  [new]
vikkiv
Member

Откуда: London
Сообщений: 2498
Сруль.,

если не ошибаюсь то у ТС задача весьма точно поставлена - показать все конечные точки (head-end) путей (без промежуточных)
из вершины самого тяжелого ребра (рёбер, если MAX весов несколько) для всей декомпозиции графов SQL набора направленных переходов.

а в решении выше - какие-то отдельные попытки сделать какие-то элементы, но это не решает задачу целиком.
в принципе конечного результата пока никто не достиг, у invm ближе всего получилось, если-бы не последняя строка в его результате 6->6

кроме всего - пример явно не репрезентативен, например у графа могут быть две разные вершины с одинаковым весом (максимальным для графа)
что можно симулировать заменив переход с (2,3,2) на (2,3,10), тогда по идее для первого графа нужно выводить ещё и все конечные точки для вершины 2.

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

Откуда:
Сообщений: 754
vikkiv
Сруль.,

если не ошибаюсь то у ТС задача весьма точно поставлена - показать все конечные точки (head-end) путей (без промежуточных)
из вершины самого тяжелого ребра (рёбер, если MAX весов несколько) для всей декомпозиции графов SQL набора направленных переходов.

а в решении выше - какие-то отдельные попытки сделать какие-то элементы, но это не решает задачу целиком.
в принципе конечного результата пока никто не достиг, у invm ближе всего получилось, если-бы не последняя строка в его результате 6->6

кроме всего - пример явно не репрезентативен, например у графа могут быть две разные вершины с одинаковым весом (максимальным для графа)
что можно симулировать заменив переход с (2,3,2) на (2,3,10), тогда по идее для первого графа нужно выводить ещё и все конечные точки для вершины 2.

т.е. по факту у всех вроде как-бы какие-то потуги, куча кода, а адекватного решения ведь пока нет..


0. Очень мутно излагаешь.
1. Все узлы графа достижимы. На то он и граф.
2. Таким образом задача сводится к определению всех узлов графа и выбору самого толстого из них
2 июл 19, 07:14    [21918667]     Ответить | Цитировать Сообщить модератору
 Re: Отсортировать (в кавычках) взвешенный граф. Возможно ли это на TSQL?  [new]
PizzaPizza
Member

Откуда:
Сообщений: 288
uaggster
Необходимо "размотать" граф, и "вытащить" его за самый тяжелый узел.

У меня безрезультатно, но приятно мозг размять и подумать.

Сразу что смущает это "самый тяжелый узел", что при взвешенном графе мне не очень понятно т.к. вес не у узла, а у ребра.
Если например у вас есть узел
(a, x, 1), (a, y, 1), (a, z, 10)

и узел
(b, x, 4), (b, y, 4), (b, z, 4)

то самым тяжелым узлом будет b по сумме весов ребер к нему.... наверное...

"самый тяжелый узел" - это парент, к которому примыкает самое тяжелое ребро или парент, к которому примыкает самая большая сумма весов ребер?

или я чего то не понимаю тут
2 июл 19, 07:20    [21918671]     Ответить | Цитировать Сообщить модератору
 Re: Отсортировать (в кавычках) взвешенный граф. Возможно ли это на TSQL?  [new]
PizzaPizza
Member

Откуда:
Сообщений: 288
самдурак конечно - в примерах моих веса одинаковые. Пусть будет так:
(b, x, 5), (b, y, 4), (b, z, 4)
2 июл 19, 07:23    [21918675]     Ответить | Цитировать Сообщить модератору
 Re: Отсортировать (в кавычках) взвешенный граф. Возможно ли это на TSQL?  [new]
uaggster
Member

Откуда:
Сообщений: 724
Прошу прощения, коллеги, отвлекся от задачи!

Сруль.
Для начала в таблицу графа, я добавил номер графа.
Разбираться, где заканчивается один граф и начинается второй,
отдельная диссертация-не уму ни сердцу.

Именно это и является основной и существенной частью задачи!

Если бы графы можно было бы пронумеровать - задача была бы предельно простой, как выше сказал invm, кажется.
Нужно просто для номера графа вытащить узел с максимальным весом, а все остальные узлы, которые помечены тем же номером графа - записать ему в дочерние.

Задача ИМЕННО в идентификации графа.

У меня была мысль решить задачу, как раз используя перечень всех достижимых из конкретной ноды узлов, отсортированных по возрастанию номеров - как номера графа.

Т.е. берем произвольную ноду. Перечисляем все достижимые из нее узлы. Сортируем их, тупо по возрастанию номеров нод. Полученное значение используем как сигнатуру ноды.
Далее - все ноды, имеющие одинаковую сигнатуру - это один граф.
Далее - тривиально. Ищем для одинаковых сигнатур ноду с максимальным весом, все остальные ноды - подчиненные.

Сломался пока как раз на нахождении отсортированного списка всех достижимых нод из конкретной ноды.

Спасибо за помощь, отдельно Ролг Хупин, попутно зарылся в графы 2017, и уже жду 2019.
2 июл 19, 08:25    [21918691]     Ответить | Цитировать Сообщить модератору
 Re: Отсортировать (в кавычках) взвешенный граф. Возможно ли это на TSQL?  [new]
uaggster
Member

Откуда:
Сообщений: 724
aleks222
vikkiv
Сруль.,

если не ошибаюсь то у ТС задача весьма точно поставлена - показать все конечные точки (head-end) путей (без промежуточных)
из вершины самого тяжелого ребра (рёбер, если MAX весов несколько) для всей декомпозиции графов SQL набора направленных переходов.

а в решении выше - какие-то отдельные попытки сделать какие-то элементы, но это не решает задачу целиком.
в принципе конечного результата пока никто не достиг, у invm ближе всего получилось, если-бы не последняя строка в его результате 6->6

кроме всего - пример явно не репрезентативен, например у графа могут быть две разные вершины с одинаковым весом (максимальным для графа)
что можно симулировать заменив переход с (2,3,2) на (2,3,10), тогда по идее для первого графа нужно выводить ещё и все конечные точки для вершины 2.

т.е. по факту у всех вроде как-бы какие-то потуги, куча кода, а адекватного решения ведь пока нет..


0. Очень мутно излагаешь.
1. Все узлы графа достижимы. На то он и граф.
2. Таким образом задача сводится к определению всех узлов графа и выбору самого толстого из них

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

Откуда:
Сообщений: 754
uaggster
Прошу прощения, коллеги, отвлекся от задачи!

Сруль.
Для начала в таблицу графа, я добавил номер графа.
Разбираться, где заканчивается один граф и начинается второй,
отдельная диссертация-не уму ни сердцу.

Именно это и является основной и существенной частью задачи!

Если бы графы можно было бы пронумеровать - задача была бы предельно простой, как выше сказал invm, кажется.
Нужно просто для номера графа вытащить узел с максимальным весом, а все остальные узлы, которые помечены тем же номером графа - записать ему в дочерние.

Задача ИМЕННО в идентификации графа.

У меня была мысль решить задачу, как раз используя перечень всех достижимых из конкретной ноды узлов, отсортированных по возрастанию номеров - как номера графа.

Т.е. берем произвольную ноду. Перечисляем все достижимые из нее узлы. Сортируем их, тупо по возрастанию номеров нод. Полученное значение используем как сигнатуру ноды.
Далее - все ноды, имеющие одинаковую сигнатуру - это один граф.
Далее - тривиально. Ищем для одинаковых сигнатур ноду с максимальным весом, все остальные ноды - подчиненные.

Сломался пока как раз на нахождении отсортированного списка всех достижимых нод из конкретной ноды.

Спасибо за помощь, отдельно Ролг Хупин, попутно зарылся в графы 2017, и уже жду 2019.


Мне нравится этот болтун. Из любой простейшей задачи - раздует проблему.
Отсортировать (в кавычках) взвешенный граф. Возможно ли это на TSQL?
2 июл 19, 08:34    [21918693]     Ответить | Цитировать Сообщить модератору
 Re: Отсортировать (в кавычках) взвешенный граф. Возможно ли это на TSQL?  [new]
vikkiv
Member

Откуда: London
Сообщений: 2498
aleks222
Мне нравится этот болтун. Из любой простейшей задачи - раздует проблему.
Отсортировать (в кавычках) взвешенный граф. Возможно ли это на TSQL?


какой смысл давать ссылку на фактическое отсутствие решения?
2 июл 19, 09:01    [21918702]     Ответить | Цитировать Сообщить модератору
 Re: Отсортировать (в кавычках) взвешенный граф. Возможно ли это на TSQL?  [new]
vikkiv
Member

Откуда: London
Сообщений: 2498
uaggster,

уже несколько версий как есть родные встроенные в MS SQL средства для решения сетевых
(транспортных, цепи маркова) и пр. задач на планирование оптимизации по теории графов.
тем-же T-SQL / stored_procedure, Microsoft даже специально для этого компании приобретал
чтобы пользователям такие инструменты были доступны (+ интеграции с другими)
научится вызывать exec sp_execute_stored_procedure @langugage=N'R' ... и проблемы решатся.
2 июл 19, 09:07    [21918704]     Ответить | Цитировать Сообщить модератору
 Re: Отсортировать (в кавычках) взвешенный граф. Возможно ли это на TSQL?  [new]
aleks222
Member

Откуда:
Сообщений: 754
vikkiv
aleks222
Мне нравится этот болтун. Из любой простейшей задачи - раздует проблему.
Отсортировать (в кавычках) взвешенный граф. Возможно ли это на TSQL?


какой смысл давать ссылку на фактическое отсутствие решения?

Там фсе есть. Глазки то протри.
2 июл 19, 09:19    [21918710]     Ответить | Цитировать Сообщить модератору
 Re: Отсортировать (в кавычках) взвешенный граф. Возможно ли это на TSQL?  [new]
vikkiv
Member

Откуда: London
Сообщений: 2498
aleks222
Там фсе есть. Глазки то протри.
ну может конечно не проснулся ещё, но эдак всюду есть всё, ведь нужно только воображение,
всего-лишь представить что есть как хочешь - и тут-же все люди станут счастливыми,
и им ничего больше в жизни не надо

просто сложилось впечатление что в твоём варианте додумывать много чего надо,
например endpoints путей 1-6 и 5-5 , развернуть конечно можно - но поднапрягшись,
если там тысячи графов слиты в таблицу с длинами цепей по сотне шагов
(с конфликтными/спорными MAX рёбрами по весу)
то имхо - изврат, смысла нет ёжикам на кактус лезть
(или кувалдой мобильник чинить - какое сравнение удобнее)


uaggster,

ставишь на SQL Server - ML компонент (R , можно и Python),
потом включения функциональности выполняешь:
sp_configure 'show advanced options',1;
go
reconfigure with override;
go
exec sp_configure 'external scripts enabled', 1;
go
reconfigure with override;
перегружаешь SQL сервис

на R терминале (под админом)
C:\Program Files\Microsoft SQL Server\MSSQL15.R\R_SERVICES\bin\x64\Rterm.exe
устанавливаешь библиотеки:
.libPaths("C:/Program Files/Microsoft SQL Server/MSSQL15.R/R_SERVICES/library")
install.packages("igraph", lib = "C:/Program Files/Microsoft SQL Server/MSSQL15.R/R_SERVICES/library",dependencies=TRUE)
у меня первое что нагуглилось - пакет igraph (хотя когда-то что-то похожее
вроде на bioconductor делал, но там задача больше на диапазоны была)
хотя по моему чуть глючный и неизвестно как под большими нагрузками будет
вести (не коммерческий всё-таки) - но такие задачи вполне решает без кучи кода
весьма эффективно, по идее вот такое на разных выборках должно работать:
drop table if exists my_r_test22
create table my_r_test22(a int,b int,c int)
insert into my_r_test22 values
(1,1,1),(1,2,1),(1,3,10),(2,3,2),(3,1,3),(3,6,1),(6,6,2),(4,4,1),(4,5,1),(5,4,2),(5,4,1);
--(1,1,1),(1,9,1),(1,3,10),(9,3,10),(3,1,3),(3,6,1),(6,6,2),(4,4,1),(4,5,1),(5,4,2),(5,4,1);
exec sp_execute_external_script @language=N'R'
,@input_data_1=N'select * from my_r_test22'
,@input_data_1_name=N'lo',@output_data_1_name=N'ot'
,@script=N'library(igraph);lg<-graph_from_data_frame(lo[,1:2], directed=TRUE);ot<-as.data.frame(t(5:6))
E(lg)$weight<-lo[,3];ld<-decompose.graph(lg);#plot(lg)
for(i in 1:length(ld)[1]){g<-ld[[i]];ed<-E(g)[which(E(g)$weight == max(E(g)$weight))];
for(j in unique(ends(g,ed)[,1])){pth<-all_shortest_paths(g,from=as.character(j))[[1]]
 for(k in 1:length(pth)){lne<-as.data.frame(t(c(as.integer(j),as.integer(tail(pth[[k]],1)$name))),col.names=names(ot))
 ot<-rbind(ot,lne)}}};ot<-ot[-1,];ot<-ot[order(ot$V1,ot$V2),]
as.data.frame(ot)'with result sets((a int,b int))
2 июл 19, 09:38    [21918720]     Ответить | Цитировать Сообщить модератору
 Re: Отсортировать (в кавычках) взвешенный граф. Возможно ли это на TSQL?  [new]
aleks222
Member

Откуда:
Сообщений: 754
vikkiv
aleks222
Там фсе есть. Глазки то протри.
ну может конечно не проснулся ещё, но эдак всюду есть всё, ведь нужно только воображение,
всего-лишь представить что есть как хочешь - и тут-же все люди станут счастливыми,
и им ничего больше в жизни не надо

просто сложилось впечатление что в твоём варианте додумывать много чего надо,
например endpoints путей 1-6 и 5-5 , развернуть конечно можно - но поднапрягшись,
если там тысячи графов слиты в таблицу с длинами цепей по сотне шагов
(с конфликтными/спорными MAX рёбрами по весу)
то имхо - изврат, смысла нет ёжикам на кактус лезть
(или кувалдой мобильник чинить - какое сравнение удобнее)


Это быстрый, простой и понятный алгоритм идентификации графа.
Все спорные, конфликтные и прочие фантастические ребра ему по барабану.
Проблема циклов и подобной дебедени не существует.
Легко обобщающийся на ориентированные графы (ТС это не нужно).
2 июл 19, 09:52    [21918729]     Ответить | Цитировать Сообщить модератору
 Re: Отсортировать (в кавычках) взвешенный граф. Возможно ли это на TSQL?  [new]
vikkiv
Member

Откуда: London
Сообщений: 2498
aleks222,

всего-лишь намекнул что там при наличии фантазии разворачивается
- но по факту на ссылке в первом rezultset: ничего больше (хотя действительно
не каждому сходу это получится реализовать, я-бы заколебался сам придумывать)
чем разбитие графов (декомпозиция на законченные конструкции), по независимым
так что согласен - не маловажный шаг в решении вопроса,
а на втором - ноды с максимальным весом в каждом графе. (court хоть визуально
пути до endpoint резвернул, но не полностью т.к. нет закольцованных на себя)

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

Откуда:
Сообщений: 754
vikkiv
TS просит конечные пункты найти от самой тяжелой ноды для каждого графа
хотя при наличии путей - края в принципе не такая-уж проблема выбрать.
, так что shortest_path - вполне подходящий инструмент
(т.к. позволяет многие находить, как в примере Б в доке)


Чукча не читатель?

uaggster
Задача ИМЕННО в идентификации графа.
2 июл 19, 12:29    [21918901]     Ответить | Цитировать Сообщить модератору
 Re: Отсортировать (в кавычках) взвешенный граф. Возможно ли это на TSQL?  [new]
court
Member

Откуда:
Сообщений: 1829
declare @graph table (parent bigint not NULL, child bigint not NULL, [weight] int not NULL, gID bigint, max_lvl int, primary key(parent, child, [weight]), unique(child, parent, [weight]) );
declare @gID bigint;

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);

--	1.
;with cte as (
	select
		start_node  =parent
		,node		=child
		,[path]		=cast('/'+cast(parent as varchar(10))+'/'+cast(child as varchar(10))+'/' as varchar(max))
		,lvl		=1 
	from @graph 
	--where parent<>child

	union all

	select 
		cte.start_node
		,node	=t.child
		,[path]	=cast(cte.[path]+cast(t.child as varchar(10))+'/' as varchar(max))
		,lvl	=cte.lvl+1 
	from @graph t inner join cte on t.parent=cte.node
	where cte.[path] not like '%/'+cast(t.child as varchar(10))+'/%'
),
cte1 as 
	(select start_node, max(lvl) as max_lvl from cte group by start_node)

update a 
set a.max_lvl	=b.max_lvl
from @graph a inner join cte1 b on a.parent=b.start_node

--	2.
set @gID = 1
while 1=1 begin
	;with cte as 
		(select top 1 parent, gID from @graph where gID is null order by max_lvl desc)
	update cte set gID=@gID

	if @@ROWCOUNT = 0 break;

	while 1=1 begin
		;with cte as 
			(select parent as node from @graph where gID=@gID union select child as node from @graph where gID=@gID)
		update @graph
		set gID=@gID
		where	gID is null
			and (parent in (select node from cte) or child in (select node from cte))

		if @@ROWCOUNT = 0 break;				
	end

	set @gID = @gID + 1
end

--	result
;with cte as 
	(select *, row_number()over(partition by gID order by [weight] desc) as rn from @graph)

select distinct  
	b.gID
	,b.parent
	,a.child
	,b.[weight] as max_weight
from @graph a inner join cte b on a.gID=b.gID
where b.rn=1


gIDparentchildmax_weight
11110
11210
11310
11610
2542
2552
2 июл 19, 12:45    [21918915]     Ответить | Цитировать Сообщить модератору
 Re: Отсортировать (в кавычках) взвешенный граф. Возможно ли это на TSQL?  [new]
vikkiv
Member

Откуда: London
Сообщений: 2498
aleks222,
ну да, технически - именно так и написанно, однако это вроде только первый шаг
в цепи реализации человека который застрял и уже начал сдаваться
и отходить от исходной задачи чтобы хоть как-то продвинутся.

там то это существенная часть, то именно, а то вдруг
"Если бы графы можно было бы пронумеровать - задача была бы предельно простой,"

uaggster
Если бы графы можно было бы пронумеровать - задача была бы предельно простой, как выше сказал invm, кажется.
Нужно просто для номера графа вытащить узел с максимальным весом, а все остальные узлы, которые помечены тем же номером графа - записать ему в дочерние.

Задача ИМЕННО в идентификации графа.


court,
не работает если два ребра будут одинаково максимально тяжелыми, например для набора
-- 1 граф
(1, 1, 1), (1, 9, 1), (1, 3, 10), (9, 3, 10), (3, 1, 3), (3, 6, 1), (6, 6, 2)
2 июл 19, 18:06    [21919333]     Ответить | Цитировать Сообщить модератору
 Re: Отсортировать (в кавычках) взвешенный граф. Возможно ли это на TSQL?  [new]
vikkiv
Member

Откуда: London
Сообщений: 2498
court,
с другой стороны да, мой косяк, недоглядел эту часть требований ТС:
Если кандидатов на самую массивную ноду в графе - несколько, то нужно выбрать одну и только одну главную ноду произвольно.
3 июл 19, 05:44    [21919554]     Ответить | Цитировать Сообщить модератору
 Re: Отсортировать (в кавычках) взвешенный граф. Возможно ли это на TSQL?  [new]
uaggster
Member

Откуда:
Сообщений: 724
court, да, спасибо, видимо это оно.
Сейчас попробую покатать на реальных данных.

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

Откуда:
Сообщений: 724
vikkiv, блин, это вообще белое пятно для меня. Я про R и Пайтон. Спасибо, покурю.
3 июл 19, 07:47    [21919572]     Ответить | Цитировать Сообщить модератору
 Re: Отсортировать (в кавычках) взвешенный граф. Возможно ли это на TSQL?  [new]
vikkiv
Member

Откуда: London
Сообщений: 2498
Кстати для более удобной работы с графами в SQL Server 2019 CTP 3.1 добавили функцию SHORTEST_PATH
10 июл 19, 12:25    [21924113]     Ответить | Цитировать Сообщить модератору
 Re: Отсортировать (в кавычках) взвешенный граф. Возможно ли это на TSQL?  [new]
uaggster
Member

Откуда:
Сообщений: 724
Ага, я ее уже нашел, см. предыдущую страницу.

Но самый лучший вариант решения - предложил aleks222, на самой первой странице.
Очень быстрый, нормально работает на 10+ миллионной таблице, и, собственно, дающий то, что нужно.
Даже адаптации не понадобилось.

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

Откуда:
Сообщений: 754
uaggster
Ага, я ее уже нашел, см. предыдущую страницу.

Но самый лучший вариант решения - предложил aleks222, на самой первой странице.
Очень быстрый, нормально работает на 10+ миллионной таблице, и, собственно, дающий то, что нужно.
Даже адаптации не понадобилось.

Только я нихера не понял, как он работает. Просто воткнул как абракадабру в текст хранимки и всё.
aleks222, может статья есть какая с разбором?


Там фсе просто, как калашников.

1. Присваиваем всем вершинам уникальные идентификаторы.
2. Для каждой пары связанный вершин выбираем и заменяем идентификатор на меньший из двух, если такой есть.
3. В результате идентификатор вершин каждого графа принимает значение минимального идентификатора из п.1, который принадлежал графу.

Худшая оценка числа циклов = максимальное число узлов в графе. Для линейного графа.
Для сильно связанных графов - число циклов меньше.

Для очень большого количества графов - алгоритм можно ускорить.
10 июл 19, 14:39    [21924218]     Ответить | Цитировать Сообщить модератору
 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]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2 3      [все]
Все форумы / Microsoft SQL Server Ответить