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

Откуда: там и тут
Сообщений: 949
Простая.

есть список:

create table x(name varchar(MAX))
insert into x values ('wordA'),('wordB'),('wordC') .... итд. до полного изнеможения

надо получить все пронумерованные пары (минимальный алгоритм)

1 wordA
1 wordB
2 wordB
2 wordC
3 wordA
3 wordC
итд..

просто селект, без т-скл переменных, с переменными я и сам знаю как в паре с newid()

а вот без переменных не понимаю.. туплю.. нужна идея.
13 окт 09, 16:39    [7779986]     Ответить | Цитировать Сообщить модератору
 Re: Задачка  [new]
Robb
Member

Откуда: там и тут
Сообщений: 949
сделал типа того.

select * from
(select 1 z union select 2 union select 3 union select 4)s
cross apply
( select top 2 * from (select ROW_NUMBER() over (order by name)n, * from x)x1 where x1.n>=s.z )q
13 окт 09, 16:43    [7780031]     Ответить | Цитировать Сообщить модератору
 Re: Задачка  [new]
Robb
Member

Откуда: там и тут
Сообщений: 949
мож че покрасивше есть?
13 окт 09, 16:44    [7780039]     Ответить | Цитировать Сообщить модератору
 Re: Задачка  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
какой-какой алгоритм?
13 окт 09, 16:46    [7780052]     Ответить | Цитировать Сообщить модератору
 Re: Задачка  [new]
Robb
Member

Откуда: там и тут
Сообщений: 949
Ну вот с парами как-то просто.. а вот потом тройки, четверки, пятерки .. там засада.

алгоритм.. да просто все пары, тройки, четверки и т.д...

только не надо решение.. просто идеи..
13 окт 09, 16:51    [7780104]     Ответить | Цитировать Сообщить модератору
 Re: Задачка  [new]
iljy
Member

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

не понял чего надо, получить все пары различных значений?
select row_number() over(order by (select 1)) n, t1.name, t2.name from
x t1 join x t2 on t1.Name != t2.Name
13 окт 09, 16:51    [7780108]     Ответить | Цитировать Сообщить модератору
 Re: Задачка  [new]
Robb
Member

Откуда: там и тут
Сообщений: 949
но пары понумерованы должны быть все.
13 окт 09, 16:52    [7780111]     Ответить | Цитировать Сообщить модератору
 Re: Задачка  [new]
Robb
Member

Откуда: там и тут
Сообщений: 949
iljy
Robb,

не понял чего надо, получить все пары различных значений?
select row_number() over(order by (select 1)) n, t1.name, t2.name from
x t1 join x t2 on t1.Name != t2.Name


как пары получить джойнами не проблема.. именно в одну таблицу.. но по твоему алгоритму посчитает только пары из таблицы с тремя строками, а если трок больше то это будут не пары.
13 окт 09, 16:54    [7780142]     Ответить | Цитировать Сообщить модератору
 Re: Задачка  [new]
Robb
Member

Откуда: там и тут
Сообщений: 949
уппс, сорри ты не так понял.. без join-ов.. (или я не дописал..)
13 окт 09, 16:57    [7780169]     Ответить | Цитировать Сообщить модератору
 Re: Задачка  [new]
Robb
Member

Откуда: там и тут
Сообщений: 949
почему без join-oв потому что если 10-20 элементов, то замучаешься писать эти != на каждый с каждым..

потому вот и ищу что-то универсальное.. ))
13 окт 09, 17:00    [7780207]     Ответить | Цитировать Сообщить модератору
 Re: Задачка  [new]
Robb
Member

Откуда: там и тут
Сообщений: 949
(order by (select 1)) - мне понравилось ))
13 окт 09, 17:01    [7780218]     Ответить | Цитировать Сообщить модератору
 Re: Задачка  [new]
Robb
Member

Откуда: там и тут
Сообщений: 949
я так делаю row_number() over(order by newid())
13 окт 09, 17:08    [7780296]     Ответить | Цитировать Сообщить модератору
 Re: Задачка  [new]
Robb
Member

Откуда: там и тут
Сообщений: 949
буду знать что есть и select 1 > спасибо
13 окт 09, 17:10    [7780312]     Ответить | Цитировать Сообщить модератору
 Re: Задачка  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5111
либо я чего то не понял либо:
declare @t table (id int identity, nam varchar(10))

insert @t(nam)
select 'A'
union all
select 'B'
union all
select 'C'
union all
select 'D'

;
with q(n,nam1,nam2)
as
(
select
row_number() over(order by t1.id) as n
,t1.nam
,t2.nam
from
@t t1
cross join @t t2
where
t1.nam!=t2.nam
and t2.id>t1.id
)

select distinct
n
,nam1
from
q
union all
select
n
,nam2
from
q
order by
n

1 A
1 B
2 C
2 A
3 A
3 D
4 C
4 B
5 B
5 D
6 D
6 C

--------------------------------------------------------------
Дьявол кроется в деталях.
13 окт 09, 17:23    [7780441]     Ответить | Цитировать Сообщить модератору
 Re: Задачка  [new]
Robb
Member

Откуда: там и тут
Сообщений: 949
да, похоже без join не обойтись.

лана, спасибо всем.
13 окт 09, 17:36    [7780531]     Ответить | Цитировать Сообщить модератору
 Re: Задачка  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5111
Robb
да, похоже без join не обойтись.

лана, спасибо всем.

а чем join то не устраивает?
13 окт 09, 17:38    [7780547]     Ответить | Цитировать Сообщить модератору
 Re: Задачка  [new]
iljy
Member

Откуда:
Сообщений: 8711
Дедушка,

можно проще -
x t1 join x t2 on t1.Name > t2.Name
но я так и непонял - что же именно надо получить...
13 окт 09, 18:15    [7780779]     Ответить | Цитировать Сообщить модератору
 Re: Задачка  [new]
Robb
Member

Откуда: там и тут
Сообщений: 949
Дедушка,

Тем что если в предложении 10 слов, то 10 join-ов, и на каждый джойн по одному условию неравенства с другими 9-ю :), а если делать блок начиная с 2-х и до 10 то результирующая табла должна быть одна. Т.е. парные селекты надо добивать null-ами до 10-нарности.

Вот тут-то я и туплю..

select * from
(select 1 z union select 2 union select 3 union select 4)s
cross apply
( select top 2 * from (select ROW_NUMBER() over (order by name)n, * from x)x1 where x1.n>=s.z )q

этот недоработанный селект делает то что надо, он сразу создает бинарную структуру записи таблицы, в которой номер пары и слово, относящееся к этому номеру пары.

:) я без претензий, просто приятно услышать мнения спецов as well.

Так что welcome!
13 окт 09, 22:06    [7781501]     Ответить | Цитировать Сообщить модератору
 Re: Задачка  [new]
Robb
Member

Откуда: там и тут
Сообщений: 949
немного неточен в предыдущем посте.. 9 джойнов конечно..
---
иногда бывает что очки, которые ищешь, на лбу
13 окт 09, 22:15    [7781540]     Ответить | Цитировать Сообщить модератору
 Re: Задачка  [new]
iljy
Member

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

так все-таки множество пар вам надо? Только в столбец? Так разверните строки в столбцы

select n, val from
(
  select row_number() over(order by (select 1)) n, t1.name name1, t2.name name2 from
     x t1 join x t2 on t1.Name < t2.Name
) t
unpivot
(
  val for name in(name1, name2)
)unpvt

13 окт 09, 22:31    [7781593]     Ответить | Цитировать Сообщить модератору
 Re: Задачка  [new]
Robb
Member

Откуда: там и тут
Сообщений: 949
iljy
Robb,

так все-таки множество пар вам надо? Только в столбец? Так разверните строки в столбцы

select n, val from
(
  select row_number() over(order by (select 1)) n, t1.name name1, t2.name name2 from
     x t1 join x t2 on t1.Name < t2.Name
) t
unpivot
(
  val for name in(name1, name2)
)unpvt



да, можно и cross join, без unpivot..

кстати, знаешь что можно мульти unpivot делать..

типа
select ...

unpivot,
unpivot
и т.д.

Прикольно.. насчет row_number() over (order by (select null)) - тоже могли бы и сделать как агрегаторы max() over() => row_number() over()... но не сделали.

Да, вот я и говорю, что без join-ов не обойтись.

Я думал может можно как-то тупо выбирать из таблицы последовательно сначала по TOP 2, потом по TOP 3 и т.д. может есть какй-то алгоритм отката назад и поиск новых пар..

Но это SQL, откатов тут нет )))
13 окт 09, 22:56    [7781680]     Ответить | Цитировать Сообщить модератору
 Re: Задачка  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5111
Robb

есть список:

create table x(name varchar(MAX))
insert into x values ('wordA'),('wordB'),('wordC') .... итд. до полного изнеможения

надо получить все пронумерованные пары (минимальный алгоритм)

1 wordA
1 wordB
2 wordB
2 wordC
3 wordA
3 wordC
итд..


Robb

...Тем что если в предложении 10 слов, то 10 join-ов, и на каждый джойн по одному условию неравенства с другими 9-ю :), а если делать блок начиная с 2-х и до 10 то результирующая табла должна быть одна. Т.е. парные селекты надо добивать null-ами до 10-нарности...

где в вашем первом посте это мистическое "предложение" из 10 слов?
напишите нормально какие у вас исходные данные и какой результат вам нужно получить.
14 окт 09, 09:27    [7782424]     Ответить | Цитировать Сообщить модератору
 Re: Задачка  [new]
Robb
Member

Откуда: там и тут
Сообщений: 949
Robb
Ну вот с парами как-то просто.. а вот потом тройки, четверки, пятерки .. там засада.

алгоритм.. да просто все пары, тройки, четверки и т.д...

только не надо решение.. просто идеи..


а это что? :)
14 окт 09, 13:49    [7784587]     Ответить | Цитировать Сообщить модератору
 Re: Задачка  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5111
Robb
Robb
Ну вот с парами как-то просто.. а вот потом тройки, четверки, пятерки .. там засада.

алгоритм.. да просто все пары, тройки, четверки и т.д...

только не надо решение.. просто идеи..


а это что? :)

Если вы у меня спрашиваете, то я то откуда знаю, что "это"?
Я у Вас спрашивал какие исходные данные и что Вам нужно получить.
И опять таки... где в этой цитате мистическое "предложение" из 10 слов?
Вам уже намекали, что не понятно, что Вы хотите (и не только я).
Что в Вашем понимании "потом тройки, четверки, пятерки"?
14 окт 09, 14:24    [7784893]     Ответить | Цитировать Сообщить модератору
 Re: Задачка  [new]
Robb
Member

Откуда: там и тут
Сообщений: 949
Да лана, для себя я вопрос уже снял.

Спсибо.
14 окт 09, 14:33    [7784982]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить