Tsql 将相关行划分为组

Tsql 将相关行划分为组,tsql,Tsql,我有一些传统的产品数据,证明很难使用。产品可以与1、2或3个部件一起销售,按照系统设计的方式,订购产品的部件2和3只是该产品第一行之后的后续行 下面是一些示例数据 ---------------------------------------------------------- OrderId Sku Type Row_Id OtherColumns... -------------------------------------------------------

我有一些传统的产品数据,证明很难使用。产品可以与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(),但没有成功。我想我只是做得不对

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

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

提前感谢你的帮助

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

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



一个“组”的标识符只是
类型
列,其中“double”值表示分组的两行,而“triple”表示三行?而且-您不应该创建一个组间不同的标识符,而不是一个似乎根本无法对行进行分组的“段”吗?第二个示例表不是我的新格式…它只是一个结果集,我可以轻松地为数据导入过程识别段。好的。我问题的第一部分呢?第一个问题正确。如果是单列,只有那一行才重要。如果是双倍,那一行和下一个问题。对于Triple,那一行和下面两行很重要。有道理?当我第一次看到他们是如何做到这一点的时候,我几乎死了。“组”的标识符只是
类型
列,其中“double”值表示两行分组,而“triple”表示三行?而且-您不应该创建一个组间不同的标识符,而不是一个似乎根本无法对行进行分组的“段”吗?第二个示例表不是我的新格式…它只是一个结果集,我可以轻松地为数据导入过程识别段。好的。我问题的第一部分呢?第一个问题正确。如果是单列,只有那一行才重要。如果是双倍,那一行和下一个问题。对于Triple,那一行和下面两行很重要。有道理?当我第一次看到他们怎么做的时候,我差点就死了。太棒了。不幸的是,我不是在2012年。@ctorx-显然你应该是:)@ctorx-如果你在
行Id
上有一个索引,并将
类型作为包含列,那么第二个版本的性能应该不会那么差。我在这方面取得了一些成功,但这并不一致。我更新了我的问题,以表明我确实有背对背的组…不确定这个查询是否正确处理了这些问题,尽管外部的apply row_id检查和描述顺序似乎会…@ctorx-返回到绘图板,这是一个全新的想法。我已经更新了我的答案,太棒了。不幸的是,我不是在2012年。@ctorx-显然你应该是:)@ctorx-如果你在
行Id
上有一个索引,并将
类型作为包含列,那么第二个版本的性能应该不会那么差。我在这方面取得了一些成功,但这并不一致。我更新了我的问题,以表明我确实有背对背的组…不确定这个查询是否正确处理了这些问题,尽管外部的apply row_id检查和描述顺序似乎会…@ctorx-返回到绘图板,这是一个全新的想法。我已经更新了我的答案。
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