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

Откуда:
Сообщений: 3
Привет, вопрос новичка в sql:

Имеется таблица типа t1

TID VAL1 VAL2 CUSTOMER
... ... ... ...
3 1 4 c1
3 3 6 c1
3 6 3 c2
3 8 3 c1
3 9 2 c2
... ... ... ...

которая отсортирована по TID и затем по VAL1 по возрастанию. Нужно сделать из нее такой селект, чтобы получилось следующее:

TID VAL1 VAL2 CUSTOMER
... ... ... ...
3 1 6 c1
3 6 3 c2
3 8 3 c1
3 9 2 c2
... ... ... ...
т.е. сгруппировать по полю CUSTOMER, получив минимальное значение VAL1 и максимальное значение VAL2, но лишь для строк, идущих подряд и имеющих одинаковое значение CUSTOMER.
Собственно как это сделать ну или хотя бы в сторону чего копать?

sql server 2008
21 сен 09, 19:49    [7689109]     Ответить | Цитировать Сообщить модератору
 Re: Группировка подряд идущих строк  [new]
Smithhh
Member

Откуда:
Сообщений: 3
Сорри, криво таблицы сделал. Вот так лучше

Исходная
TIDVAL1VAL2CUSTOMER
............
314c1
336c1
363c2
383c1
392c2
............


Результат
TIDVAL1VAL2CUSTOMER
............
316c1
363c2
383c1
392c2
............
21 сен 09, 19:59    [7689137]     Ответить | Цитировать Сообщить модератору
 Re: Группировка подряд идущих строк  [new]
iljy
Member

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

declare @t table (TID int, val1 int, val2 int, customer varchar(10))
insert into @t
select 3,1,4,'c1' union all
select 3,3,6,'c1' union all
select 3,6,3,'c2' union all
select 3,8,3,'c1' union all
select 3,9,2,'c2'

select tid, min(val1) val1, max(val2) val2, customer from
(
	select row_number() over(order by tid, val1) rn, rank() over(partition by tid,customer order by val1) r, *
	from @t
)t
group by tid, customer, rn - r
21 сен 09, 20:10    [7689155]     Ответить | Цитировать Сообщить модератору
 Re: Группировка подряд идущих строк  [new]
Smithhh
Member

Откуда:
Сообщений: 3
ухх, я даже слов таких не знаю - over, partition...) спасибо за ответ, буду разбираться как это работает
21 сен 09, 20:57    [7689221]     Ответить | Цитировать Сообщить модератору
 Re: Группировка подряд идущих строк  [new]
demian111
Member

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

мне очень понравилось.
особенно вот это:
group by tid, customer, rn - r

тока после этого примера перечитал по поводу group by более внимательно:)
21 сен 09, 21:41    [7689353]     Ответить | Цитировать Сообщить модератору
 Re: Группировка подряд идущих строк  [new]
iljy
Member

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

Да, я когда подобное первый раз увидел - тоже порадовался. Но на практике такие решения оказываются медленными, поскольку требуют несколько сортировок по ходу выполнения, и никакие индексы не помогут. Так что на реальных базах такие вещи как правило проще считать на клиенте.
21 сен 09, 23:41    [7689686]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить