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)を使用しましたが、成功しませんでした。私はそれを正しくやっていないと思います。

理想的には、次のような結果セットを生成できるようにしたいと思います:(セグメント列に注意)

-------------------------------------------------------------------
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 に答える