2013-06-04 4 views
0
id  operation  age  shoesize 
1  .   24  12 
2  .   23  10 
1  .   24  11 
3  R -   24   9 
4  .   25  -9.5 

Je veux supprimer les lignes en double, les lignes avec « R » - et les lignes avec shoeSize < 0.supprimer des observations en double et d'autres lignes spécifiées

Merci pour l'aide à l'avance

+0

je dois que je dois enregistrer ce tableau trop – user2448666

+0

Quel devrait être votre sortie avec Respectez les données que vous avez fournies – Luv

+0

Quels sont vos critères pour les doublons? – Luv

Répondre

0
delete from table_name 
where operation ='R -' 
or cast(shoesize as int)< 0 

SQL Fiddle

Edit

delete t1 
from Table1 t1 
inner join (select ROW_NUMBER()over 
(partition by id, operation, age, shoesize order by id, operation, age, shoesize) 
AS [row_id],* from Table1)t2 
on t1.operation=t2.operation and t1.[age]=t2.[age] and t1.shoesize=t2.shoesize 
where t2.row_id>1 
or t1.[operation] ='R -' 
or cast(t1.shoesize as int)< 0 

SQL Fiddle

+0

qui obtient les doublons aussi? – user2448666

+0

Quels sont vos critères de duplication? – Luv

+0

toutes les colonnes correspondantes. Je suppose que j'ai échoué à insérer cela dans mon échantillon – user2448666

3

En supposant que id ne peut pas être dupliquées, vous pouvez effectuer les opérations suivantes:

;WITH CTE AS 
(
    SELECT id, 
      operation, 
      age, 
      shoesize, 
      N = COUNT(*) OVER(PARTITION BY operation, age, shoesize) 
    FROM YourTable 
) 
DELETE FROM CTE 
WHERE N > 1 
OR operation = 'R -' 
OR shoesize < 0 

Si id doit être pris en compte pour les doublons, puis:

;WITH CTE AS 
(
    SELECT id, 
      operation, 
      age, 
      shoesize, 
      N = COUNT(*) OVER(PARTITION BY id, operation, age, shoesize) 
    FROM YourTable 
) 
DELETE FROM CTE 
WHERE N > 1 
OR operation = 'R -' 
OR shoesize < 0 

Si vous devez supprimer uniquement les lignes en double, et que vous voulez laisser une de ces lignes, alors vous devez faire:

;WITH CTE AS 
(
    SELECT id, 
      operation, 
      age, 
      shoesize, 
      RN = ROW_NUMBER() OVER(PARTITION BY id, operation, age, shoesize ORDER BY id) 
    FROM YourTable 
) 
DELETE FROM CTE 
WHERE RN > 1 
OR operation = 'R -' 
OR shoesize < 0 
+0

id peut être dupliqué – user2448666

+0

@ user2448666 Ensuite, vous pouvez utiliser la deuxième partie de ma réponse :-) – Lamak

+0

haha, n'a pas lu votre réponse à fond la première fois. Merci encore – user2448666

Questions connexes