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