Среда - Azure DW. У меня есть необработанная таблица, подобная приведенной ниже;
ID Start End Action date
1 10 15 Processed 25-10-2019
2 55 105 In-Progress 21-10-2019
.....
Мне нужно расширить / преобразовать столбцы Start и End так, чтобы они стали серийными номерами;
SN Action date
10 Processed 25-10-2019
11 Processed 25-10-2019
12 Processed 25-10-2019
13 Processed 25-10-2019
14 Processed 25-10-2019
.....
Хранилище данных Azure не поддерживает рекурсивные CTE или Cursor. Итак, попробовал цикл while,
create table #temp_output (SerialNumber int not null, startSerialNumber int not null, endSerialNumber int not null);
insert into #temp_output select startSerialNumber, startSerialNumber, endSerialNumber from dbo.raw
declare @rowcount int, @cnt int, @start int, @end int
set @cnt = 1
set @rowcount = (select count(*) from dbo.raw)
while @cnt <= @rowcount
begin
select top (@cnt) @start = startSerialNumber from dbo.raw
select top (@cnt) @end = endSerialNumber from dbo.raw
while @start <= @end
begin
insert #temp_output
select max(SerialNumber) + 1,
startSerialNumber,
endSerialNumber
from #temp_output group by startSerialNumber, endSerialNumber having max(SerialNumber) < endSerialNumber
set @start = @start + 1
end
set @cnt = @cnt + 1
end
select SerialNumber, startSerialNumber, endSerialNumber from #temp_output_delta order by SerialNumber
Однако на это уходит целая вечность (6 часов, когда я отменил запрос), поскольку в необработанной таблице 50 миллионов строк.
Нужен лучший способдля этого.
Обновленная информация 31-10-2019
Распределением для исходной таблицы является хеш. 500 DWu. 60 миллионов строк в исходной таблице. Средняя разница между началом и концом 3000. Старт также может быть 2 миллиона. Нет индекса на основной таблице. Число столбцов 15 Кластерный индекс columnstore для необработанной таблицы.