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