0

Проблема состоит в том, чтобы генерировать серийный идентификатор группы в столбце A (сегмент), который начинает идентифицировать строки от A до следующего C столбца B (индикатор) в качестве сегмента. Столбец B является индикатором начала сегмента (A) и конца сегмента (C). Все, что находится между ними (B или X), должно быть помечено идентификатором сегмента, включая строки с A и C. Надеюсь, что это достаточно ясно.Генерировать идентификатор группы/сегмента с помощью CTE

File as received

Processed file with generated Group/Segment identity

мне нужны предложения, которые будут наилучшим решением проблемы. У меня петля .Net делает это медленно, но я экспериментирую с CTE. Пожалуйста помоги.

+2

Независимо от метода будет, я бы сказал, что вы _должны_ столбец, который вы можете _order_ данные. Нет ли столбца идентификатора? – KekuSemau

+1

Нет гарантированного отображения от физического к логическому порядку. Если у вас нет столбца заказа в исходных данных, вам потребуется предварительная обработка строк за строкой. –

+0

... путем чтения файла через какой-либо другой процесс (например, C# или все, что можно открыть и прочитать файл) и понять, какая строка первая, вторая и т. Д. После того, как SQL Server имеет данные в таблице или источнике данных, это по определению неупорядоченное множество строк. –

ответ

1

Если таблица имеет столбец Id, и ваша таблица называется [Материал], то это работает:

-- Set the segment values for rows where Indicator = 'A' 
update [Stuff] 
    set Segment = s.row 
from 
    (select ROW_NUMBER() OVER(ORDER BY Id) as Row, Id 
    from [Stuff] where Indicator = 'A') s 
where 
    s.Id = [Stuff].Id 

-- Update the other rows 
update [Stuff] 
set Segment = (
    select top 1 Segment from [Stuff] s1 
    where s1.Segment is not null and s1.Id <= [Stuff].Id 
    order by Id desc 
) 

update [Stuff] set Segment = -1 where Indicator = '#' 
update [Stuff] set Segment = 0 where Indicator = '##' 
+0

Спасибо за ответы. – TiredMaster

+0

У меня наверняка есть столбец идентификатора, чтобы указать номер строки и сделать что-то вроде того, что сделал Фил. С добавленным столбцом идентификатора я пытаюсь понять, можно ли это сделать с помощью CTE, который не нуждается в каких-либо обновлениях таблиц и замках и т. Д. Пожалуйста, дайте мне знать, если вы, ребята, можете подумать об эффективном методе (если возможно, с CTE). – TiredMaster

Смежные вопросы