2013-03-20 3 views
2
Column 0 Column 1  Column 2 Column 3 Column 4 
csus  00287y109  38   NULL  169 
mbus  01185pag4  NULL  NULL  1 
mbus  01185pag4  100   NULL  18 
mbus  018033DR8  100   NULL  5 
psus  20002309  26   NULL  5 
cbus  025816aq2  NULL  NULL  169 
cdus  02586tbj2X  101   NULL  1 
cdus  02586tbj2X  NULL  NULL  1 

Je dois supprimer les lignes en double de cette table nommée combinée. Cependant, toutes les lignes ne sont pas dupliquées et les lignes dupliquées ne sont pas identiques dans chaque colonne. Un exemple de doublon est la ligne 2 et la ligne 3. Le critère de suppression est le suivant: s'il existe une ligne où la colonne 0 et la colonne 1 sont identiques, conservez la ligne qui a une valeur dans la colonne 2, déposez la ligne avec NULL dans la colonne 2 s'il existe une ligne dupliquée avec une valeur dans Colonne 0 et Colonne 1 et Colonne 2. Les valeurs nulles sont correctes comme vous le voyez dans Colonne 2, ligne 6 parce que cela n'est dupliqué avec aucune autre ligne basée sur mes critères se concentre sur les trois premières colonnes. Null n'est pas correct si la colonne 0 et la colonne 1 sont dupliquées. La colonne 3 est toujours NULL et peu importe si la colonne 4 est dupliquée ou non. Les deux dernières rangées, lignes 7 et 8 sont également dupliquées. Je veux garder la ligne 7, car il a une valeur dans la colonne 2.SQL Server: aide à supprimer les doublons en lignes alternées

Ajouté le résultat attendu

Column 0 Column 1  Column 2 Column 3 Column 4 
csus  00287y109  38   NULL  169 
mbus  01185pag4  100   NULL  18 
mbus  018033DR8  100   NULL  5 
psus  20002309  26   NULL  5 
cbus  025816aq2  NULL  NULL  169 
cdus  02586tbj2X  101   NULL  1 

En conséquence les lignes 2 et 8 désirée ont été enlevés.

+0

http: // stackoverflow .com/questions/7565664/comment-supprimer-tout-mais-quelques-enregistrements-sur-un-seuil/7565818 # 7565818 –

Répondre

4

Essayez ceci:

with cte as 
(
Select * , 
row_number() over (partition by [Column 0],[Column 1] order by [Column 2] desc) rn 
from Sample 
) 
Select * from cte 
where rn=1 

Démo SQL FIDDLE

Sur une note de côté don't use spaces dans column names .Si vous voulez vraiment utiliser l'espace puis utilisez underscore

Updated 

;with cte as 
( 
    Select * , 
    row_number() over (partition by [Column 0],[Column 1] order by [Column 2] desc) rn 
    from Sample 
) 
Insert into final 
Select [Column 0], [Column 1], [Column 2], [Column 3] , [Column 4] 
from cte 
where rn=1 
+0

Je suis d'accord sur les espaces dans les en-têtes, mais je ne peux pas changer les en-têtes. –

+0

Je pense que cela a fonctionné. Je dois faire des recherches un peu plus. Je vous remercie. –

+1

Votre solution fonctionne. Je l'ai marqué comme répondu. Je suis étonné que vous ayez pu y répondre avec une requête aussi succincte. –

Questions connexes