2012-04-26 36 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