2010-01-29 6 views
1

J'ai un grand ensemble de données, dont certaines sont des enregistrements en double, qui sont identifiables par des dupes dans deux champs.Renommez les données, puis supprimez les doublons

Pour trouver ces enregistrements, les travaux requête suivante:

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

Fondamentalement, ce que je veux faire est chat ensemble toutes les valeurs de « Description » pour former une seule rangée, puis remplacer toutes les lignes dupliquées avec la seule rangée.

Ceci est ma question à moitié cassée jusqu'à présent, c'est kludgy et horrible. Mon objectif principal est de faire fonctionner ça - mais si j'apprends de nouvelles astuces en SQL, ce n'est pas du tout une mauvaise chose.

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 ..... 

C'est loin comme je l'ai obtenu. Que devrais-je lire pour aller un peu plus loin? J'ai lu quelques livres et beaucoup de pages sur le sujet. Cependant dans ce cas je pense que mon problème n'est pas limité manque de SQL (ok, ce n'est pas mon problème seulement) mais plus approcher le problème dans le mauvais sens.

EDIT 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" 

^^ est ce que je veux créer de 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" 

^^ en notant que les lignes de ne pas avoir plus d'une ligne de description doivent rester intacte.

Je l'ai créé à ce jour les nouveaux enregistrements dans une nouvelle table avec:

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 

Alors maintenant, tout ce qui reste est de supprimer les enregistrements qui ont été attrapés par la commande cat. Il semble que je ne peux pas DELETE FROM avec une clause ayant? Je pense que DELETE FROM table WHERE oid IN (SELECT OID's using having clause) va fonctionner?

EDIT 2:

SELECT array_accum(oid) 
FROM supplierstuffs 

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

retourne quelques tableaux de 2 OID, qui doivent tous être delorted. Je sens que je suis très proche, et pourtant si loin. Merci à l'avance

+0

@Richo - vous avez demandé comment vous auriez pu mieux l'expliquer. Vous pourriez avoir donné des exemples de données que vous avez et les données que vous voulez. J'ai réécrit ma réponse avec ma meilleure estimation à ce sujet. Ce serait une bonne idée si vous éditiez votre requête pour inclure ce genre d'information; les exemples rendent toujours les choses plus claires. – APC

+0

@APC - Merci, je vais prendre cela à bord. Je vais mettre à jour la question dans les prochaines minutes avec quelques exemples de données et où j'en suis. Merci encore. – richo

Répondre

0

Donc ce que vous avez actuellement est quelque chose comme ça ...

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

... et ce que vous voulez est ...

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

cela ne fonctionne toujours pas semble être la bonne approche. Cette description concaténée me semble erronée. Cependant, vous connaissez mieux vos données et les exigences de vos clients que moi.

+0

Je pense peut-être que je n'ai pas expliqué correctement (je ne sais pas comment l'exprimer dans le titre du fil ..) Ce que je cherche à faire est de modifier les lignes avec les nouvelles données, puis supprimer les doublons en laissant une seule ligne pour chaque .. Est-ce que cela a plus de sens? Comment pourrais-je décrire ce processus? – richo

+0

Oh, et la raison de ces dupes est que j'importe des données d'une liste de clients dans notre système, pour leur ancien usage, le format de données des clients a fonctionné mais il ne convient pas à notre modèle. – richo

+0

C'est exactement ce que je cherche! Cependant, je pense que je l'ai peut-être trié avec la solution de bkm. – richo

2

L'approche suivante travaillera

  1. que les lignes Identifier double et de les stocker dans une nouvelle table.
  2. Supprimer les lignes en double de table parent
  3. Concatenate la description colonne dans la table ne contenant que lignes en double. Concaténer en utilisant une clause group by .
  4. Insérez toutes les lignes à partir du résultat de l'étape 3 dans le tableau original .
+0

Merci bkm. Je peux faire le mouvement dans la table temporaire, je suis un peu vague sur la façon dont cela change réellement mon problème si? J'essayais de le faire en place avec un groupe par .. et pas vraiment aller n'importe où. Plus précisément, je ne suis pas sûr de savoir comment déplacer les lignes vers une table qui a moins (mais pas 0) lignes qui ne me intéresse pas aide? Avez-vous des liens? – richo

+0

Oh, attends, je pense que je viens de le recevoir: 1) Créer table temporaire 2) Insérez uniquement les lignes raffinées générées par le chat + groupe par dans la table temporaire 3) Tuyau les duplicates dans le tableau original 4) Réinsérer seulement nettoyer les lignes de la table temporaire? Merci, je vais essayer. – richo