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

declare @t table (i1 int, i2 int, i3 int)

insert into @t (i1, i2, i3) values (1, 1, 123)
insert into @t (i1, i2, i3) values (1, 1, 124)
insert into @t (i1, i2, i3) values (1, 2, 129)
insert into @t (i1, i2, i3) values (1, 1, 125)
insert into @t (i1, i2, i3) values (1, 2, 132)
insert into @t (i1, i2, i3) values (3, 4, 122)
insert into @t (i1, i2, i3) values (1, 2, 131)
insert into @t (i1, i2, i3) values (2, 8, 127)
insert into @t (i1, i2, i3) values (2, 6, 130)
insert into @t (i1, i2, i3) values (3, 5, 128)
insert into @t (i1, i2, i3) values (3, 5, 133)

Результат должен получиться такой:

i1i2i3
11123
12129
26130
28127
34122
35128
11124
12131
35133
11125
12132


Блин, голову уже сломал, как сделать...
30 июн 09, 13:22    [7358722]     Ответить | Цитировать Сообщить модератору
 Re: Хитрая сортировка  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36808
Что-то у вас в примере второе поле никак не по порядку.
30 июн 09, 13:25    [7358738]     Ответить | Цитировать Сообщить модератору
 Re: Хитрая сортировка  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

> Результат должен получиться такой:
>
> i1 i2 i3
> 1 1 123
> 1 2 129
> 2 6 130
> 2 8 127
> 3 4 122
> 3 5 128
> 1 1 124
> 1 2 131
> 3 5 133
> 1 1 125
> 1 2 132
>

так?
;with t as(
select *, row_number() over (partition by i1, i2 order by i3) rn
from @t
)
select * from t order by rn, i1, i2

Posted via ActualForum NNTP Server 1.4

30 июн 09, 13:29    [7358774]     Ответить | Цитировать Сообщить модератору
 Re: Хитрая сортировка  [new]
Спрашиватель
Guest
daw

так?
;with t as(
select *, row_number() over (partition by i1, i2 order by i3) rn
from @t
)
select * from t order by rn, i1, i2
Похоже на то, а если не сложно, можно в двух словах, как в данном запросе работает PARTITION BY? Никогда не пользовался этим зверем :)
30 июн 09, 13:37    [7358847]     Ответить | Цитировать Сообщить модератору
 Re: Хитрая сортировка  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Кстати, ROW_NUMBER() можно и сразу в ORDER BY поместить (без CTE)
select *
from @t
order by row_number() over (partition by i1, i2 order by i3), i1, i2;
30 июн 09, 13:41    [7358888]     Ответить | Цитировать Сообщить модератору
 Re: Хитрая сортировка  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

> Похоже на то, а если не сложно, можно в двух словах, как в данном
> запросе работает PARTITION BY? Никогда не пользовался этим зверем :)

это значит, что нумерация не сквозная, а в пределах каждой группы
строк с одинаковым сочетанием (i1, i2). вот так виднее:
;with t as(
select *, row_number() over (partition by i1, i2 order by i3) rn
from @t
)
select i1, i2, rn from t order by i1, i2


Posted via ActualForum NNTP Server 1.4

30 июн 09, 13:41    [7358892]     Ответить | Цитировать Сообщить модератору
 Re: Хитрая сортировка  [new]
Спрашиватель
Guest
Интересная штука однако, группировка без группировки, спасибо что просвятили. Осталось испытать на производительность.
30 июн 09, 13:50    [7358950]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить