0

簡単な質問は、PKを使用してレコードのセットを取得し、複製のキーをわずかに変更して、ソースごとに正確に2つのレコードを作成するにはどうすればよいかということです。つまり、4000レコードを取得し、4000が同一で、他の4000のキーがわずかに変更された8000レコードを生成します。これは本質的に2つの選択(長い話)であるため、私は結合を行うことができません。

残りは複雑になりますが、例を提供するために必要かもしれません。

これは私のオリジナルセットです(4000以上のレコードが含まれています)

dateGroup areaGroup itemID editionID
   1          1        1       1
   1          1        1       2
   1          2        1       1
   1          2        2       1

   2          1        1       1
   2          1        1       2
   2          2        1       1
   2          2        1       2

レコードごとに、areaGroupsを「0」の下にまとめた複製レコードを作成してから、元のareaGroupsのコンマ区切りリストを個別のフィールドとして作成する必要があります。(「なぜ」は、約15年前に間違えた愚かなプログラマーです。)必要に応じてeditionIDの番号を付け直すことはできますが、元のレコードと複製レコードは同じeditionIDである必要があります(したがって、ユニオンが機能しない理由) 。PKは上記と同じままです(すべてのフィールド)

dateGroup areaGroup itemID editionID aGroups
   1          0        1       1        1
   1          0        1       2        1
   1          0        1       1        2    // Duplicate (EditionID)
   1          0        2       1        2
   2          0        1       1        1
   2          0        1       2        1
   2          0        1       1        2    // Duplicate (EditionID)
   2          0        1       2        2

最終結果は、レコードを一意にするために必要に応じてeditionIDの番号を付け直します。

dateGroup areaGroup itemID editionID aGroups  (EditionID is what is altered)
   1          0        1       1        1
   1          0        1       2        1
   1          0        1       2        2    1 changed to 2 (one more than row 1)
   1          0        2       1        2
   2          0        1       1        1
   2          0        1       2        1
   2          0        1       2        2    1 changed to 2 (one more than row 1)
   2          0        1       2        2

   1          1        1       1
   1          1        1       2
   1          2        1       2             1 changed to 2 (editionID) to match
   1          2        2       1

   2          1        1       1
   2          1        1       2
   2          2        1       2             1 changed to 2 to match above
   2          2        1       2

次のように行ランクのようにeditionIDを計算できることはわかっています。

select row_number() over ( 
       partition by dateGroup, itemID 
       order by dateGroup, itemID) as editionID

したがって、必要なのは、単一のセットからレコードを複製する方法を知ることだけです。

4

3 に答える 3

2

I'd create a temporary table with duplicates and their count. Then I'd filter the original table to have only unique rows, and insert another row for each row in the temporary table, incrementing their editionID.

In MySQL, I'd use user @variables; not sure about MS SQL.

于 2010-12-17T17:28:41.277 に答える
2

派生テーブルでクロス結合を実行します:(aGroupsunion all select 2として1を選択します)

于 2010-12-17T17:23:33.710 に答える
1

UNION ALLただの代わりにやってみましたかUNION

UDPATE おそらく私は問題を誤解していて、あなたは組合が重複を失うことに問題を抱えていると思いました。

問題がユニオンに対してrow_numberを実行したい場合は、次のようなことを実行しませんか。

select row_number() over ( 
       partition by dateGroup, itemID 
       order by dateGroup, itemID) as editionID
FROM
(

         SELECT 

              dateGroup, itemID
          FROM TableA
          UNION ALL 
         SELECT 

              dateGroup, itemID
          FROM TableB 
) Data
于 2010-12-17T17:26:34.850 に答える