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