2012-04-26 44 views
2

我有一些遺留的產品數據證明難以使用。產品可以1,2或3個零件出售,系統設計的方式,訂購產品的第2和第3部分只是該產品的第一排之後的後續行。將分區相關的行分組到

下面是一些樣本數據....

---------------------------------------------------------- 
OrderId  Sku  Type  Row_Id OtherColumns... 
---------------------------------------------------------- 
123   001  Double 0  Other stuff.. 
123   001  Double 1  Other stuff.. 
123   001  Double 2  Other stuff.. 
123   001  Double 3  Other stuff.. 
123   002  Single 4  Other stuff.. 
123   003  Triple 5  Other stuff.. 
123   003  Triple 6  Other stuff.. 
123   003  Triple 7  Other stuff.. 
123   001  Double 8  Other stuff.. 
123   001  Double 9  Other stuff.. 
123   002  Single 10  Other stuff.. 
123   002  Single 11  Other stuff.. 
123   002  Single 12  Other stuff.. 
123   002  Single 13  Other stuff.. 

舊的軟件(VB)與此交易通過循環行和期待,因爲它循環,得到它從行所需要的信息,然後跳過它們。

快進8年......我在我的新工作中繼承了這個系統,並從頭開始重寫系統。我遇到的問題是將舊數據轉換爲我的新格式。

我正在尋找一種方法來選擇相同的數據,並通過適當的段號進行分區。我使用了RANK()OVER(PARTITION BY),但沒有成功。我覺得我只是做得不對。

理想情況下,我希望能夠產生一個結果集,看起來像這樣:(注:段列)

------------------------------------------------------------------- 
OrderId  Sku  Type  Row_Id  Segment OtherColumns... 
------------------------------------------------------------------- 
123   001  Double 0   1   Other stuff.. 
123   001  Double 1   2   Other stuff.. 
123   001  Double 2   1   Other stuff.. 
123   001  Double 3   2   Other stuff.. 
123   002  Single 4   1   Other stuff.. 
123   003  Triple 5   1   Other stuff.. 
123   003  Triple 6   2   Other stuff.. 
123   003  Triple 7   3   Other stuff.. 
123   001  Double 8   1   Other stuff.. 
123   001  Double 9   2   Other stuff.. 
123   002  Single 10   1   Other stuff.. 
123   002  Single 11   1   Other stuff.. 
123   002  Single 12   1   Other stuff.. 
123   002  Single 13   1   Other stuff.. 

理想情況下,我想,以避免光標或循環。我將使用查詢來遷移從多個表派生的數百萬條記錄。

在此先感謝您的幫助。

編輯 我已經更新了示例數據以顯示我確實有背靠背組需要隔離。

+0

標識符爲「基團」是僅'Type'柱,其中一個「雙重」值意味着分組兩行,及「三重」是指3?而且 - 你不應該創建一個在組中不同的標識符,而不是一個似乎根本不分組的行。 – 2012-04-26 04:32:02

+0

第二個示例表格不是我的新格式......它僅僅是一個結果集,可讓我輕鬆識別數據導入過程中的細分受衆羣。 – ctorx 2012-04-26 04:33:52

+0

好的。我的問題的第一部分? – 2012-04-26 04:35:05

回答

4
select OrderId, 
     Sku, 
     Type, 
     Row_Id, 
     (row_number() over(partition by Type order by Row_Id) - 1) % 
     case Type 
      when 'Single' then 1 
      when 'Double' then 2 
      when 'Triple' then 3 
     end + 1 
from YourTable 
order by Row_Id 

SQL Fiddle

+0

太棒了。不幸的是,我不在2012年。 – ctorx 2012-04-26 05:49:01

+1

@ctorx - 顯然你應該:) – 2012-04-26 05:49:27

+0

@ctorx - 如果你在'Row_Id'上有一個索引'Type'作爲包含列。 – 2012-04-26 06:00:20