0

问题是必须在列A(段)中生成一个串行GroupID,该列开始从列A到列B(指示器)的下一个C作为段标识行。 B列是区段开始(A)和区段结束(C)的指示符。在(B或X)之间的任何内容应该用区段ID标记,包括具有A和C的行。希望它足够清楚。使用CTE生成组/段标识

File as received

Processed file with generated Group/Segment identity

我需要建议,这将解决这一问题的最佳解决方案。我有一个.Net循环,这样做很慢,但正在试验CTE。请帮忙。

+2

不管是什么方法会,我会说,你_must_有一列,你可以按数据排序。有没有ID列? – KekuSemau 2013-02-16 21:11:49

+1

没有从物理到逻辑顺序的有保证的映射。如果源数据中没有排序列,则需要预先逐行进行处理。 – 2013-02-16 21:22:33

+0

...通过某些其他进程(例如C#或任何可以打开并真正读取文件的文件)读取文件并理解哪一行是第一个,第二个等等。一旦SQL Server将数据存储在表或数据源中,它根据定义是无序的一组行。 – 2013-02-16 22:00:06

回答

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 2013-02-17 01:45:48

+0

我当然可以有一个ID列来表示行号,并做类似Phil所做的事情。有了一个附加的ID列,我想知道这是否可以用CTE来完成,而CTE不需要任何表更新和锁定以及其他东西。请让我知道,如果你们可以考虑一种有效的技术(如果可能的话用CTE )。 – TiredMaster 2013-02-17 01:52:56