Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Сортировка с рангом  [new]
Larr`
Member

Откуда: у парня сирийская грусть?
Сообщений: 745
Возможно, вопрос уже обсуждался, но что-то не могу найти...

Есть таблица
idid2r
1220
1415
248
346
352
4520
.........

где id и id2 - id строк одной таблицы, а r - степень похожести одной строки на другую.
Надо отсортировать исходную таблицу блоками большой похожести строк. (Возможно, что легче будет, если добавить записи, сравненные сами с собой, такое тоже можно сделать)
Т.е. результат условно такой: 1, 2, 4, 5, 3
11 янв 10, 11:18    [8164123]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка с рангом  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Larr`
Возможно, вопрос уже обсуждался, но что-то не могу найти...

Есть таблица
idid2r
1220
1415
248
346
352
4520
.........

где id и id2 - id строк одной таблицы, а r - степень похожести одной строки на другую.
Надо отсортировать исходную таблицу блоками большой похожести строк. (Возможно, что легче будет, если добавить записи, сравненные сами с собой, такое тоже можно сделать)
Т.е. результат условно такой: 1, 2, 4, 5, 3
USE tempdb;
SET NOCOUNT ON;

IF OBJECT_ID(N'T','U') IS NOT NULL DROP TABLE T;
CREATE TABLE T(id INT,id2 INT,r INT);
INSERT T(id,id2,r)VALUES
 (1,2,20)
,(1,4,15)
,(2,4,8)
,(3,4,6)
,(3,5,2)
,(4,5,20);

SELECT CASE f WHEN 1 THEN id ELSE id2 END id
FROM (SELECT * FROM T CROSS JOIN (SELECT 1 UNION ALL SELECT 2)U(f))T
GROUP BY CASE f WHEN 1 THEN id ELSE id2 END
ORDER BY MAX(r) DESC,id;
11 янв 10, 11:41    [8164315]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка с рангом  [new]
Larr`
Member

Откуда: у парня сирийская грусть?
Сообщений: 745
iap,
Не совсем так. Строки могут быть с одинаковым рангом, а ваш запрос соответственно их впихивает в середину, а блок должен ещё состоять из близких строк. Т.е. когда процедура работала на двух разных таблицах, было проще - строки одной таблицы были главными, а строки второй - прицеплялись уже к ним. А вот как здесь?
11 янв 10, 12:04    [8164482]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка с рангом  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Larr`
iap,
Не совсем так. Строки могут быть с одинаковым рангом, а ваш запрос соответственно их впихивает в середину, а блок должен ещё состоять из близких строк. Т.е. когда процедура работала на двух разных таблицах, было проще - строки одной таблицы были главными, а строки второй - прицеплялись уже к ним. А вот как здесь?
Где пример данных, для которых неправильно запрос работает?
И какой результат нужен в этом случае?
11 янв 10, 12:17    [8164591]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка с рангом  [new]
Larr`
Member

Откуда: у парня сирийская грусть?
Сообщений: 745
iap,
Да, я неправильно сформулировал задание...
Надо выстраивать блок, пока не найдётся другая пара с большим рангом, т.е.
id id2r
1220
1315
148
156
162
4510
5620
.........


И результат должен быть: 1,2,3,5,6,4, а ваш результат 1,2,5,6,3,4 Но 3 должно стоять возле 1, поскольку это для нее лучший ранг.
11 янв 10, 13:20    [8165044]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка с рангом  [new]
Anddros
Member

Откуда:
Сообщений: 1077
declare @t table (id int, id2 int, r int)
insert @t select 1, 2, 20 
union all select 1, 3, 15 
union all select 1, 4, 8 
union all select 1, 5, 6 
union all select 1, 6, 2 
union all select 4, 5, 10  
union all select 5, 6, 20 

declare @t1 table (id int primary key, pos int, r int) 

declare @id int
declare @id2 int
declare @r int
declare @pos int
select @pos=0

declare cur cursor local static for
select id, id2, r
from @t
order by r desc,id,id2

open cur
fetch cur into @id, @id2, @r
while @@fetch_status=0
begin
  select @pos=isnull(min(pos),@pos+1)
	from @t1 where id in (@id,@id2)
  if not exists(select * from @t1 where id=@id)  
	insert @t1 (id, pos, r) select @id, @pos, @r
  if not exists(select * from @t1 where id=@id2)  
	insert @t1 (id, pos, r) select @id2, @pos, @r
  fetch next from cur into @id, @id2, @r
end

select id 
from @t1
order by pos, r desc
11 янв 10, 15:45    [8166169]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить