2012-01-11 4 views
1

J'ai une table qui se compose des colonnes id (clé), symbole, direction, plage, prix, pourcentage. Je voudrais supprimer les données où le symbole, la direction, le prix et le pourcentage sont les mêmes qui ont la gamme la plus basse. Comment pourrais-je accomplir cela?Suppression des doublons dans SQL dans Access

J'ai essayé de modifier cette déclaration: DELETE FROM aw WHERE id not in (select min(id) from aw group by symbol, direction, price, percent); pour que quelque chose fonctionne.

+0

Je ne suis pas sûr de votre premier paragraphe. Cela signifie-t-il que vous ne voulez conserver qu'une seule ligne pour chaque combinaison de symbole, de direction, de prix et de pourcentage?et cette ligne devrait être la première avec la valeur de gamme la plus basse pour cette combinaison de champs? – HansUp

+0

@HansUp c'est exactement ce que je veux – Mike

Répondre

2

Voici des exemples de données pour la table aw. D'après votre description, je pense que vous voulez jeter les lignes avec ID valeurs de 2, 3 et 5.

ID symbol direction range price percent 
1 a  x   15 10  5 
2 a  x   20 10  5 
3 b  y   40 50  5 
4 b  y   10 50  5 
5 a  x   15 10  5 

déterminer la valeur de plage minimum pour chaque combinaison de symbol, direction, price et percent .

qryMinRanges:

SELECT 
    aw.symbol, 
    aw.direction, 
    aw.price, 
    aw.[percent], 
    Min(aw.range) AS MinOfrange 
FROM aw 
GROUP BY 
    aw.symbol, 
    aw.direction, 
    aw.price, 
    aw.[percent]; 

... qui donne à ce jeu de résultats:

symbol direction price percent MinOfrange 
a  x   10  5   15 
b  y   50  5   10 

Déterminer le ID minimum pour chacune de ces gammes minimales.

qryMinID_forMinRanges:

SELECT 
    q.symbol, 
    q.direction, 
    q.price, 
    q.[percent], 
    q.MinOfrange, 
    Min(aw.ID) AS MinOfID 
FROM 
    qryMinRanges AS q 
    INNER JOIN aw 
    ON 
     (q.MinOfrange = aw.range) 
     AND (q.[percent] = aw.[percent]) 
     AND (q.price = aw.price) 
     AND (q.direction = aw.direction) 
     AND (q.symbol = aw.symbol) 
GROUP BY 
    q.symbol, 
    q.direction, 
    q.price, 
    q.[percent], 
    q.MinOfrange; 

... qui donne à ce jeu de résultats:

symbol direction price percent MinOfrange MinOfID 
a  x   10  5   15  1 
b  y   50  5   10  4 

Alors qryMinID_forMinRanges devrait représenter les lignes que vous souhaitez conserver. En fin de compte, vous allez supprimer les lignes de aw dont les valeurs d'ID ne sont pas incluses dans qryMinID_forMinRanges. Mais essayez d'abord cette requête SELECT pour confirmer que vous ciblez les enregistrements corrects pour la suppression.

SELECT 
    aw.ID, 
    aw.symbol, 
    aw.direction, 
    aw.range, 
    aw.price, 
    aw.[percent] 
FROM aw 
WHERE aw.ID Not In 
    (SELECT MinOfID FROM qryMinID_forMinRanges); 

... qui me donne cet ensemble de résultats:

ID symbol direction range price percent 
2 a  x   20 10  5 
3 b  y   40 50  5 
5 a  x   15 10  5 

Donc, si cela semble correct, modifiez à une requête SUPPRIMER.

DELETE * 
FROM aw 
WHERE 
    (((aw.ID) Not In 
     (SELECT MinOfID FROM qryMinID_forMinRanges))); 

Le moteur db ne nécessite pas l'* après SUPPR. Mais si vous souhaitez utiliser l'aperçu du concepteur de requêtes, vous devez lui donner une spécification de champ à afficher.

Veuillez prendre des précautions pour protéger vos données au cas où j'aurais foiré des détails ici. Les sauvegardes sont bonnes. :-)

2

Essayez d'utiliser la clause exists:

DELETE FROM aw 
WHERE 
    exists (
     select 
      1 
     from 
      (select symbol, direction, price, percent, min(range) as minrange from aw 
      group by symbol, direction, price, percent) aw2 
     where 
      aw2.symbol = aw.symbol 
      and aw2.direction = aw.direction 
      and aw2.price = aw.price 
      and aw2.percent = aw.percent 
      and aw2.minrange = aw.range 
    ) 
+0

mais j'ai besoin de la gamme min, pas min id – Mike

+0

@Mike - Désolé, mal interprété votre question. Essayez ça :) – Eric

+0

Je ne voudrais pas simplement aller de l'avant et lancer une requête 'DELETE' comme ça. Qui sait ce qu'il pourrait faire s'il avait un bug? ça pourrait juste tout effacer. –

Questions connexes