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

Откуда:
Сообщений: 38
Есть таблица [t] из трех полей id, [start], [stop]:
id int IDENTITY(1,1) NOT NULL,
[start] int NOT NULL,
[stop] int NOT NULL

Поле [start] определяет начальное значение непрерывного диапазона, поле [stop] - конечное. Например:
id   start stop
1    1      3
2    4      5
3    1      2

Надо получить таблицу [result]:
id NOT NULL,
[res] int NOT NULL

id res
1  1
1  2
1  3
2  4
2  5
3  1
3  2

Курсором в цикле как бы понятно, а, мож, как-нить красивее, без курсоров, можно развернуть диапазон?
8 окт 13, 01:17    [14937067]     Ответить | Цитировать Сообщить модератору
 Re: развернуть диапазон значений  [new]
petalvik
Member

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

CREATE TABLE #t (
	id int IDENTITY(1,1) NOT NULL,
	start int NOT NULL,
	stop int NOT NULL
)
INSERT #t (start, stop) VALUES (1,3)
INSERT #t (start, stop) VALUES (4,5)
INSERT #t (start, stop) VALUES (1,2)

CREATE TABLE #result (
	id int,
	res int
)

DECLARE @min int, @max int
SELECT @min = min(start), @max = max(stop) FROM #t

WHILE @min <= @max BEGIN
	INSERT INTO #result
	SELECT id, @min FROM #t WHERE @min >= start AND @min <= stop;
	SELECT @min = @min+1
END

SELECT * FROM #t
SELECT * FROM #result ORDER BY id, res

DROP TABLE #result, #t
8 окт 13, 03:23    [14937143]     Ответить | Цитировать Сообщить модератору
 Re: развернуть диапазон значений  [new]
Добрый Э - Эх
Guest
Alexs_001,

рекурсивный CTE тебе в помощь
8 окт 13, 04:46    [14937169]     Ответить | Цитировать Сообщить модератору
 Re: развернуть диапазон значений  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 5975
Добрый Э - Эх
рекурсивный CTE тебе в помощь

Нафига?
;with cte as (
  select t.id, t.start, t.stop from (
    values
      (1, 1, 3),
      (2, 4, 5),
      (3, 1, 2)
  )t(id, start, stop)
)
select e.id, v.number res
from cte e
cross join master..spt_values v
where v.type='P' and v.number between e.start and e.stop
8 окт 13, 06:49    [14937217]     Ответить | Цитировать Сообщить модератору
 Re: развернуть диапазон значений  [new]
Добрый Э - Эх
Guest
Сон Веры Павловны,

чтобы не удивляться неполному разворачиванию диапазона в случае, когда диапазон больше, чем чисел в spt_values
8 окт 13, 07:45    [14937260]     Ответить | Цитировать Сообщить модератору
 Re: развернуть диапазон значений  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 5975
Добрый Э - Эх
когда диапазон больше, чем чисел в spt_values

Когда диапазон большой, обычно рекомендуют создавать отдельную таблицу с последовательностью и кластерным индексом по ней, т.к. рекурсивная генерация последовательности большого объема - достаточно тормозная штука.
8 окт 13, 07:54    [14937269]     Ответить | Цитировать Сообщить модератору
 Re: развернуть диапазон значений  [new]
prog882
Guest
Alexs_001,

declare @t table
(id int IDENTITY(1,1) NOT NULL,
[start] int NOT NULL,
[stop] int NOT NULL)

insert into @t 
select 1,3 union all
select 4,5 union all
select 1,2 

;with cte as (
select lvl=1, sm=sum(stop-start+1) from @t
union all
select lvl=lvl+1, sm from cte where lvl < sm
)
select t1.id, c.lvl from @t t1
cross join cte c
where c.lvl between t1.start and t1.stop
order by t1.id, c.lvl
8 окт 13, 08:25    [14937308]     Ответить | Цитировать Сообщить модератору
 Re: развернуть диапазон значений  [new]
prog882
Guest
prog882,

надо исправить:

... where lvl <= sm
8 окт 13, 08:37    [14937331]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить