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

Откуда:
Сообщений: 170
Приветствую. Прошу помочь с запросом.
sql server 2005
Есть таблица.
use tempdb
go
--drop table test
--go
create table dbo.TEST (id INTEGER, val INTEGER)
go
INSERT dbo.TEST VALUES(1, 327)
INSERT dbo.TEST VALUES(1, 328)
INSERT dbo.TEST VALUES(1, 329)
INSERT dbo.TEST VALUES(1, 330)
INSERT dbo.TEST VALUES(1, 331)
INSERT dbo.TEST VALUES(2, 333)
INSERT dbo.TEST VALUES(2, 334)
INSERT dbo.TEST VALUES(2, 335)
INSERT dbo.TEST VALUES(2, 336)
INSERT dbo.TEST VALUES(2, 337)
INSERT dbo.TEST VALUES(2, 347)

Нужно выделить последовательность чисел.Последовательностью считаем числа, где каждое следующее на 1 больше предыдущего. В нашем примере это будет 327-331,333-337. В результате нужно получить
id val
1 327-331
2 333-337
2 347
30 дек 13, 14:29    [15364907]     Ответить | Цитировать Сообщить модератору
 Re: Как задать последовательность чисел в виде диапазона  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Поиск ,друг мой ,поиск - на форуме готовых решений штук 100
30 дек 13, 14:31    [15364920]     Ответить | Цитировать Сообщить модератору
 Re: Как задать последовательность чисел в виде диапазона  [new]
aleks2
Guest
1. Диапазон кончается там, где начинается дырка.
2. Начала и концы диапазонов идут ПО ПОРЯДКУ.

Вот, в общем то, и фсе...
30 дек 13, 14:36    [15364936]     Ответить | Цитировать Сообщить модератору
 Re: Как задать последовательность чисел в виде диапазона  [new]
Speshuric
Member

Откуда: г. Москва
Сообщений: 129
igr_ok,

для небольших диапазонов можно так:

use tempdb;
declare @t table (id INTEGER, val INTEGER);
insert @t values
(1, 327),(1, 328),(1, 329),(1, 330),(1, 331),
(2, 333),(2, 334),(2, 335),(2, 336),(2, 337),(2, 347),(2, 348);
with cte as (select t.id, t.val val1, t.val val2
from @t t where not exists (select * from @t t2 where t2.val = t.val-1)
union all select t.id, t.val1, t.val2 + 1
from cte t where exists (select * from @t t2 where t2.val = t.val2+1))
select id, val1, MAX(val2) val2 from cte group by id, val1;


для больших диапазонов придётся переписать, чтобы рекурсия не углублялась или снять ограничения на вложенность
30 дек 13, 16:00    [15365392]     Ответить | Цитировать Сообщить модератору
 Re: Как задать последовательность чисел в виде диапазона  [new]
sdet
Member

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

select id,MIN(val) val1,MAX(val) val2
from
(select id,val,val-DENSE_RANK() over (partition by id order by val) as rnk from dbo.TEST) t
group by id,rnk
30 дек 13, 16:12    [15365472]     Ответить | Цитировать Сообщить модератору
 Re: Как задать последовательность чисел в виде диапазона  [new]
igr_ok
Member

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

Спасибо! То, что нужно
30 дек 13, 16:13    [15365481]     Ответить | Цитировать Сообщить модератору
 Re: Как задать последовательность чисел в виде диапазона  [new]
igr_ok
Member

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

Круто. Спасибо
30 дек 13, 16:19    [15365512]     Ответить | Цитировать Сообщить модератору
 Re: Как задать последовательность чисел в виде диапазона  [new]
aleks2
Guest
Нда.
Все самые гнусные и тормозные алгоритмы.
30 дек 13, 16:22    [15365523]     Ответить | Цитировать Сообщить модератору
 Re: Как задать последовательность чисел в виде диапазона  [new]
sdet
Member

Откуда:
Сообщений: 463
aleks2
Нда.
Все самые гнусные и тормозные алгоритмы.

Предложи ТС свой вариант
30 дек 13, 16:33    [15365593]     Ответить | Цитировать Сообщить модератору
 Re: Как задать последовательность чисел в виде диапазона  [new]
o-o
Guest
sdet,

по-моему, aleks2 предложил выше через left join.
просто у него сегодня настроение "неразжевывательное"
30 дек 13, 16:36    [15365607]     Ответить | Цитировать Сообщить модератору
 Re: Как задать последовательность чисел в виде диапазона  [new]
qwerty112
Guest
o-o
sdet,

по-моему, aleks2 предложил выше через left join.
просто у него сегодня настроение "неразжевывательное"


14175885
30 дек 13, 16:41    [15365625]     Ответить | Цитировать Сообщить модератору
 Re: Как задать последовательность чисел в виде диапазона  [new]
o-o
Guest
qwerty112,
у меня сегодня недискуссионный настрой и неохота вникать в суть очередного препирательства с aleks2.
я только могу остальным привести свою интерпретацию сего высказывания

aleks2
1. Диапазон кончается там, где начинается дырка.
2. Начала и концы диапазонов идут ПО ПОРЯДКУ.

Вот, в общем то, и фсе...

это прямой намек на то, что "края" диапазонов left join-ом получаются:
declare @t table (id INTEGER, val INTEGER);
insert @t values
(1, 327),(1, 328),(1, 329),(1, 330),(1, 331),
(2, 333),(2, 334),(2, 335),(2, 336),(2, 337),(2, 347),(2, 348)

select *
from @t t1 left join @t t2 on t1.id = t2.id and t1.val = t2.val + 1
where t2.id is null;
--------------
id	val	id	val
1	327	NULL	NULL
2	333	NULL	NULL
2	347	NULL	NULL

select *
from @t t1 left join @t t2 on t1.id = t2.id and t1.val = t2.val - 1
where t2.id is null
--------------
id	val	id	val
1	331	NULL	NULL
2	337	NULL	NULL
2	348	NULL	NULL


а далее, как это воедино собрать, с участием временных таблиц, того или этого,
пусть решают заинтересованные лица :)
30 дек 13, 16:58    [15365691]     Ответить | Цитировать Сообщить модератору
 Re: Как задать последовательность чисел в виде диапазона  [new]
qwerty112
Guest
o-o
qwerty112,
у меня сегодня недискуссионный настрой и неохота вникать в суть очередного препирательства с aleks2.
я только могу остальным привести свою интерпретацию сего высказывания
...

дык, я ж тоже не ради "препирательств" :) (по ссылке их особо и нет)
а собстна, "расскрыл мысль" ))

там (по ссылке) аналогичный Вашему код (в "исполнении" aleks2) через времянки
и его сравнение с запросом через окон.функцию+группировку (в "исполнении" me:) ), - аналог предложенного sdet
30 дек 13, 17:10    [15365771]     Ответить | Цитировать Сообщить модератору
 Re: Как задать последовательность чисел в виде диапазона  [new]
sdet
Member

Откуда:
Сообщений: 463
qwerty112,
Спасибо за ссылку
30 дек 13, 17:32    [15365878]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить