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) 没有成功。我想我只是做得不对。

理想情况下,我希望能够生成如下所示的结果集:(注意 Segment 列)

-------------------------------------------------------------------
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..

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

在此先感谢您的帮助。

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

4

1 回答 1

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小提琴

于 2012-04-26T05:45:00.857 回答