将相关行划分为组

时间:2012-04-26 04:27:24

标签: tsql

我有一些遗传产品数据已被证明难以使用。产品可以与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..

理想情况下,我想避免使用游标或循环。我将使用该查询来迁移从多个表派生的数百万条记录。

提前感谢您的帮助。

修改 我已经更新了示例数据,以表明我确实有我需要隔离的背对背组。

1 个答案:

答案 0 :(得分: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

相关问题