問題是必須在列A(段)中生成一個串行GroupID,該列開始從列A到列B(指示器)的下一個C作爲段標識行。 B列是區段開始(A)和區段結束(C)的指示符。在(B或X)之間的任何內容應該用區段ID標記,包括具有A和C的行。希望它足夠清楚。使用CTE生成組/段標識
Processed file with generated Group/Segment identity
我需要建議,這將解決這一問題的最佳解決方案。我有一個.Net循環,這樣做很慢,但正在試驗CTE。請幫忙。
問題是必須在列A(段)中生成一個串行GroupID,該列開始從列A到列B(指示器)的下一個C作爲段標識行。 B列是區段開始(A)和區段結束(C)的指示符。在(B或X)之間的任何內容應該用區段ID標記,包括具有A和C的行。希望它足夠清楚。使用CTE生成組/段標識
Processed file with generated Group/Segment identity
我需要建議,這將解決這一問題的最佳解決方案。我有一個.Net循環,這樣做很慢,但正在試驗CTE。請幫忙。
如果你的表有一個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 = '##'
感謝您的回覆。 – TiredMaster 2013-02-17 01:45:48
我當然可以有一個ID列來表示行號,並做類似Phil所做的事情。有了一個附加的ID列,我想知道這是否可以用CTE來完成,而CTE不需要任何表更新和鎖定以及其他東西。請讓我知道,如果你們可以考慮一種有效的技術(如果可能的話用CTE )。 – TiredMaster 2013-02-17 01:52:56
不管是什麼方法會,我會說,你_must_有一列,你可以按數據排序。有沒有ID列? – KekuSemau 2013-02-16 21:11:49
沒有從物理到邏輯順序的有保證的映射。如果源數據中沒有排序列,則需要預先逐行進行處理。 – 2013-02-16 21:22:33
...通過某些其他進程(例如C#或任何可以打開並真正讀取文件的文件)讀取文件並理解哪一行是第一個,第二個等等。一旦SQL Server將數據存儲在表或數據源中,它根據定義是無序的一組行。 – 2013-02-16 22:00:06