2010-09-22 15 views
2

Le code ci-dessous explique le mieux ce que j'essaie d'accomplir. Je sais que je peux utiliser un curseur ou une autre routine de bouclage pour faire une boucle dans les enregistrements pour trouver les doublons et créer mes enregistrements de notes en fonction de ce qui est trouvé. J'essaie d'éviter cela, à moins qu'il n'y ait pas de meilleure option.Déduplification des données

DROP TABLE #orig 
DROP TABLE #parts 
DROP TABLE #part_notes 

CREATE TABLE #orig(partnum VARCHAR(20), notes VARCHAR(100)); 
INSERT INTO #orig VALUES ('A123', 'To be used on Hyster models only') 
INSERT INTO #orig VALUES ('A123', 'Right Hand model only') 
INSERT INTO #orig VALUES ('A125', 'Not to be used by Jerry') 
INSERT INTO #orig VALUES ('A125', NULL) 
INSERT INTO #orig VALUES ('A125', 'asdfasdlfj;lsdf') 
INSERT INTO #orig VALUES ('A128', 'David test') 
INSERT INTO #orig VALUES ('A129', 'Fake part') 

SELECT COUNT(*) FROM #orig 

-- SHOW ME UNIQUE PARTS, MY PARTS TABLE SHOULD BE UNIQUE! 
SELECT DISTINCT partnum FROM #orig 


CREATE TABLE #parts(id INT IDENTITY(1,1), partnum VARCHAR(20)); 
INSERT INTO #parts 
SELECT DISTINCT partnum FROM #orig 

SELECT * FROM #parts 

CREATE TABLE #part_notes(id INT IDENTITY(1,1), part_id INT, line_number INT, notes VARCHAR(100)); 
/* 
    HOW DO I AT THIS POINT POPULATE the #part_notes table so that it looks like this: 
    (note: any NULL or empty note strings should be ignored) 

    id part_id line_number notes 
    1 1  1   To be used on Hyster models only  
    2 1  2   Right Hand model only 
    3 2  1   Not to be used by Jerry 
    4 2  2   asdfasdlfj;lsdf 
    6 3  1   David test 
    7 4  1   Fake part 

*/ 
+0

Comment devrait être attribué 'line_number'? Sans 'ORDER BY', les lignes de' orig' seront lues sans ordre particulier. – eumiro

Répondre

1

Le dessous juste choisit arbitrairement line_numbers car il ne semble pas être quelque chose apte à order by dans les données.

SELECT p.id part_id, 
     p.partnum , 
     ROW_NUMBER() over (partition BY p.id ORDER BY (SELECT 0)) line_number, 
     notes 
FROM  #parts p 
     JOIN #orig o 
     ON  o.partnum=p.partnum 
WHERE notes IS NOT NULL 
AND  notes   <> '' 
ORDER BY part_id 
+0

Cela fonctionne parfaitement pour moi. Comme il n'y a pas d'ordre pour les notes actuellement, je ne suis pas concerné par l'ordre dans lequel elles sont ajoutées. Merci! – dtaylo04

+0

Martin - existe-t-il un moyen d'exécuter ce script une deuxième fois et de commencer line_number au numéro de ligne actuel + 1 pour cet id_partage? – dtaylo04

+0

a répondu à ma propre question: 'ROW_NUMBER() sur (partition PAR ORDRE PAR p.id (SELECT 0)) + ISNULL (MAX (n.line_number), 0) line_number' et comprennent une jointure externe gauche: ' LEFT OUTER JOIN #part_notes n sur p.id = n.part_id' vous devez également ajouter une clause 'Group By'. – dtaylo04