1

私は大きなデータセットを持っていますが、その一部は重複レコードであり、2つのフィールドの重複によって識別できます。

これらのレコードを見つけるには、次のクエリが機能します。

SELECT * FROM supplierstuffs
GROUP BY "Supplier Code", "Cost ex Tax"
HAVING count("Description") > 1

基本的に私がやりたいのは、「Description」のすべての値をまとめて1つの行を形成し、複製されたすべての行を1つの行に置き換えることです。

これはこれまでの私の半分壊れたクエリです、それは不器用で恐ろしいです。私の主な目標はこれを機能させることですが、SQLでいくつかの新しいトリックを学んだとしても、それはまったく悪いことではありません。

UPDATE supplierstuffs SET "Description" = 
(SELECT array_to_string(array_accum("Description"), ', ') FROM supplierstuffs
GROUP BY "Supplier Code", "Cost ex Tax"
HAVING count("Description") > 1)
WHERE .....

これは私が得た限りです。もう少し先に進むために何を読むべきですか?私はこのトピックに関する数冊の本とたくさんのウェブページを読みました。ただし、この場合、私の問題はSQLの欠如だけではなく(それが私の唯一の問題ではありません)、問題に間違った方法でアプローチしていることだと思います。

編集1:

'Name'; 'Supplier Code'; 'Desciption';
"7CPS PODIUM S/SLV CRICKET POLO";"7CPS";"04 -14, S - 3XL"
"7CP PODIUM CRICKET PANT  ";"7CP";"08 -14, S - 2XL"
"7CPT PODIUM 3/4 SLV CRICKET POLO";"7CPT";"04 -14, S - 3XL"
"7CPL PODIUM L/SLV CRICKET POLO";"7CPL";"04 -14, S - 3XL"
"T444MS Cool dry breathable sporty T-shirts";"T444MS";"XS - 2XL, XS - 2XL"
"T232RG Raglan Sleeve Tee";"T232RG";"XS - 3XL, 8-16"

^^は私がvvから作成したいものです

"T232RG Raglan Sleeve Tee";"T232RG";"XS - 3XL"
"T232RG Raglan Sleeve Tee";"T232RG";"XS - 3XL"
"T232RG Raglan Sleeve Tee";"T232RG";"S - 3XL"
"T232RG Raglan Sleeve Tee";"T232RG";"XS - 3XL"
"T232RG Raglan Sleeve Tee";"T232RG";"XS - 3XL"
"T232RG Raglan Sleeve Tee";"T232RG";"XS - 3XL"
"T232RG Raglan Sleeve Tee";"T232RG";"XS - 3XL"
"T232RG Raglan Sleeve Tee";"T232RG";"XS - 3XL"
"T232RG Raglan Sleeve Tee";"T232RG";"8-16"
"T232RG Raglan Sleeve Tee";"T232RG";"XS - 3XL"
"T232RG Raglan Sleeve Tee";"T232RG";"XS - 3XL"
"T232RG Raglan Sleeve Tee";"T232RG";"XS - 3XL"
"T232RG Raglan Sleeve Tee";"T232RG";"XS - 3XL"
"T232RG Raglan Sleeve Tee";"T232RG";"XS - 3XL"
"T232RG Raglan Sleeve Tee";"T232RG";"XS - 3XL"
"T232RG Raglan Sleeve Tee";"T232RG";"XS - 3XL"
"T444MS Cool dry breathable sporty T-shirts";"T444MS";"XS - 2XL"
"T444MS Cool dry breathable sporty T-shirts";"T444MS";"XS - 2XL"
"T444MS Cool dry breathable sporty T-shirts";"T444MS";"XS - 2XL"
"T444MS Cool dry breathable sporty T-shirts";"T444MS";"XS - 2XL"
"7CP PODIUM CRICKET PANT  ";"7CP";"08 -14"
"7CP PODIUM CRICKET PANT  ";"7CP";"S - 2XL"
"7CPL PODIUM L/SLV CRICKET POLO";"7CPL";"04 -14"
"7CPL PODIUM L/SLV CRICKET POLO";"7CPL";"S - 3XL"
"7CPS PODIUM S/SLV CRICKET POLO";"7CPS";"04 -14"
"7CPS PODIUM S/SLV CRICKET POLO";"7CPS";"S - 3XL"
"7CPT PODIUM 3/4 SLV CRICKET POLO";"7CPT";"04 -14"
"7CPT PODIUM 3/4 SLV CRICKET POLO";"7CPT";"S - 3XL"

^^複数の説明行がない行は、そのままにしておく必要があることに注意してください。

これまでに、次の新しいテーブルに新しいレコードを作成しました。

INSERT INTO tmptable
SELECT "Name" , "Supplier Code", array_to_string(array_accum("Description"), ', ')
FROM supplierstuffs

GROUP BY "Name", "Supplier Code", "Description"
    HAVING count("Description") > 1 

したがって、残っているのは、catコマンドによってキャッチされたレコードを削除することだけです。DELETE FROM私は持っている節でできないようですか?私はそれDELETE FROM table WHERE oid IN (SELECT OID's using having clause)がうまくいくと思っていますか?

編集2:

SELECT array_accum(oid)
FROM supplierstuffs

GROUP BY "Name", "Supplier Code", "Colour", "Cost ex Tax"
    HAVING count("Description") > 1 

2つのOIDの配列をいくつか返しますが、これらはすべて削除する必要があります。私はとても近くにいると感じていますが、それでも今のところです。前もって感謝します

4

2 に答える 2

2

次のアプローチが機能します

  1. 重複する行のみを識別し、それらを新しいテーブルに格納します。
  2. 親テーブルから重複する行を削除する
  3. 重複する行のみを含むテーブルの説明列を連結します。groupby句を使用して連結します。
  4. 手順3の結果のすべての行を元のテーブルに挿入します。
于 2010-01-29T05:53:29.533 に答える
0

だからあなたが現在持っているのはこのようなものです...

DESCRIPTION            SUPPLIER_CODE  COST_EX_TAX
Widget                 X23                  42.00 
Brass gadget           X23                  42.00 
Flange                 X42                  23.00 
Flange, steel          X42                  23.00 

...そしてあなたが欲しいのは...

DESCRIPTION            SUPPLIER_CODE  COST_EX_TAX
Brass gadget, Widget   X23                  42.00 
Flange, Flange, steel  X42                  23.00 

これはまだ正しいアプローチのようには思えません。その連結されたDESCRIPTIONは私には間違っているようです。しかし、あなたは私よりもあなたのデータとあなたの顧客の要求をよく知っています。

于 2010-01-29T05:37:29.237 に答える