Переименуйте данные, затем удалите дубликаты - PullRequest
1 голос
/ 29 января 2010

У меня большой набор данных, некоторые из которых являются дублирующимися записями, которые можно идентифицировать по двойникам в двух полях.

Чтобы найти эти записи, работает следующий запрос:

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

По сути, я хочу объединить все значения «Description» в одну строку, а затем заменить все дублированные строки одной строкой.

Это мой наполовину неработающий запрос, он грязный и ужасный. Моя основная цель - заставить это работать - но если я изучу некоторые новые трюки в 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 (хорошо, это не моя проблема only ), а скорее решает проблему неправильно.

РЕДАКТИРОВАТЬ 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 oids, каждый из которых должен быть удален. Я чувствую, что я очень близок, и все же так далеко. Заранее спасибо

Ответы [ 2 ]

2 голосов
/ 29 января 2010

Следующий подход будет работать

  1. Определить только дубликаты строк и сохраните их в новой таблице.
  2. Удалить повторяющиеся строки из родительского стол
  3. Объединить описание столбец в таблице, содержащий только повторяющиеся строки. Объединить с помощью группировать по пунктам.
  4. Вставить все строки из результата шага 3 в оригинальный стол.
0 голосов
/ 29 января 2010

Итак, то, что у вас сейчас есть, выглядит примерно так ...

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 

Это все еще не похоже на правильный подход. Это каскадное ОПИСАНИЕ мне кажется неправильным. Однако вы знаете свои данные и требования своего клиента лучше, чем я.

...