Разница между двумя столбцами в отдельных строках для каждого значения между двумя - PullRequest
0 голосов
/ 05 ноября 2019

Мне сложно объяснить мою проблему, но у меня есть эта таблица

ID  START   END
1   10      12
2   30      31
3   11      13

и я хочу что-то вроде этого:

ID  NUMBER
1   10
1   11
1   12
2   30
2   31
3   11
3   12
3   13

Мне нужны все уникальные целые числа между двумястолбцы превращаются в отдельные строки.

Вот как я хочу, чтобы преобразование выглядело как

Я ничего не пробовал, потому что даже не знаю, как вызвать такую ​​процедуру, поэтому любая помощь приветствуется

Ответы [ 3 ]

2 голосов
/ 05 ноября 2019

Если у вас нет таблицы чисел (настоятельно рекомендуется), вы можете использовать специальную таблицу в сочетании с CROSS APPLY

Пример

Select A.ID
      ,B.Number 
 From  YourTable A
 Cross Apply ( Select Top ([End]-[Start]+1) 
                      Number=[START]-1+Row_Number() Over (Order By (Select NULL)) 
                From  master..spt_values n1, master..spt_values n2 
             ) B

Возвращает

ID  Number
1   10
1   11
1   12
2   30
2   31
3   11
3   12
3   13
1 голос
/ 05 ноября 2019

В SQL Server вы можете использовать рекурсивный CTE:

with cte as (
      select id, [start] as number, [end] as end_number
      from t
      union all
      select id, number + 1
      from cte
      where number < end_number
     )
select id, number
from cte;

Примечание. Если диапазон может превышать 100, вам нужно option (maxrecursion) для запроса.

Рекурсивные CTEобычно немного медленнее таблицы чисел. Однако я нахожу их намного быстрее, чем я ожидал.

0 голосов
/ 05 ноября 2019

--create table NewTable
--(
--ID int,
--NUMBER int
--)</p>

<p>DECLARE @ID nvarchar(50) 
declare @START int
declare @END int</p>

<p>DECLARE Cursor_Name CURSOR 
FOR 
    select ID, [START], [End] from tblSequences
    OPEN Cursor_Name<br>
    FETCH NEXT FROM Cursor_Name    INTO  @ID,@START,@END
    WHILE @@FETCH_STATUS = 0
    begin</p>

<code>    WHILE @START<=@END
    begin
        insert into NewTable (ID, NUMBER) Values (@ID, @START)
        set @START = @START+1
    end

FETCH NEXT FROM Cursor_Name INTO  @ID,@START,@END
end 
</code>

ЗАКРЫТЬ Cursor_Name
DEALLOCATE Cursor_Name

выбрать * из NewTable

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...