7
votes

SQL - Comment puis-je supprimer des lignes en double par la dernière valeur entrée?

J'ai ce code à partir de ce lien: Comment puis-je supprimer des lignes en double?

 ;WITH cte
 AS (SELECT ROW_NUMBER() OVER (PARTITION BY person_id, date_work, hours
                                   ORDER BY ( SELECT 0)) RN
     FROM   work_hours)
 DELETE FROM cte
 WHERE  RN > 1


1 commentaires

Sauf si vous réservez une colonne pour cela, il n'ya aucun moyen de connaître la dernière ligne insérée. +1 sur les efforts cependant


3 Réponses :


4
votes

Oui - Vous ou devez introduire date_of_enterry champ ou un autre champ de vecteur comme identité . Par exemple, si la colonne ID est votre int Identity , alors votre requête ressemblera à ceci: xxx

bien sûr il est valide si personne ne change les valeurs dans identité colonne

et si vos conditions s'assoient - alors vous pouvez utiliser la colonne heures comme votre Champ de vecteur au sein de la plage de regroupement de person_id, date_work

et encore meilleur
est d'avoir un index unique sur colonnes sur colonnes Code> perseu_id, date_work, heures , il n'y aura aucune possibilité d'ajouter des doublons.


0 commentaires

6
votes

Ajouter Commandez par Heures de descesc CODE>

;WITH cte
 AS (SELECT ROW_NUMBER() OVER (PARTITION BY person_id, date_work
                                   ORDER BY hours DESC) RN
     FROM   work_hours)
 DELETE FROM cte
 WHERE  RN > 1


1 commentaires

Commander par Heures de rapport est une réponse acceptable, elle supprime une colonne en double avec un nombre inférieur d'heures. Merci pour votre réponse