web-dev-qa-db-fra.com

comment sélectionner des lignes sur la base de valeurs distinctes de A COLUMN uniquement

J'ai besoin d'interroger une table pour renvoyer des lignes, mais je ne suis pas en mesure d'interroger la table correctement. Voici ma vue de table:

Id                MailId          EmailAddress          Name
1                 1               [email protected]               Mr. A
2                 1               [email protected]               Mr. B
3                 1               [email protected]               Mr. C
4                 1               [email protected]               Mr. D
5                 1               [email protected]               Mr. A
6                 2               [email protected]               Mr. E
7                 2               [email protected]               Mr. A
8                 3               [email protected]               Mr. F
9                 4               [email protected]               Mr. D  
10                5               [email protected]               Mr. F
11                6               [email protected]               Mr. D

L'ensemble de résultats doit retourner:

Id                MailId          EmailAddress          Name
1                 1               [email protected]               Mr. A
2                 1               [email protected]               Mr. B
3                 1               [email protected]               Mr. C
4                 1               [email protected]               Mr. D
6                 2               [email protected]               Mr. E
8                 3               [email protected]               Mr. F

En d'autres termes: tout d'abord, je souhaite sélectionner des adresses de messagerie distinctes, puis renvoyer des lignes contenant des adresses de messagerie distinctes.

Remarque: Le simple fait d'utiliser le mot-clé "Distinct" ne fonctionnera pas ici, car il sélectionnera des lignes distinctes. Mon exigence est de sélectionner des adresses e-mail distinctes, puis de sélectionner des lignes contenant ces adresses.

Edit: Je ne peux pas non plus utiliser le mot-clé "Group By", car pour cela je devrai également Grouper avec Id (qui est le PK) et cela retournera deux lignes avec les mêmes valeurs EmailAddress mais avec des identifiants différents.

27
user576510

En regardant votre sortie, la requête suivante peut fonctionner, essayez-la:

SELECT * FROM tablename
WHERE id IN
(SELECT MIN(id) FROM tablename GROUP BY EmailAddress)

Cela ne sélectionnera qu'une seule ligne pour chaque adresse e-mail distincte, la ligne avec le minimum id qui est ce que votre résultat semble représenter

56
danishgoel

Essayez ceci - vous avez besoin d'un CTE (Common Table Expression) qui partitionne (groupe) vos données par adresse e-mail distincte et trie chaque groupe par ID - le plus petit en premier. Ensuite, il vous suffit de sélectionner la première entrée pour chaque groupe - cela devrait vous donner ce que vous recherchez:

;WITH DistinctMails AS
(
    SELECT ID, MailID, EMailAddress, NAME,
        ROW_NUMBER() OVER(PARTITION BY EMailAddress ORDER BY ID) AS 'RowNum'
    FROM dbo.YourMailTable
)
SELECT *
FROM DistinctMails
WHERE RowNum = 1

Cela fonctionne sur SQL Server 2005 et plus récent (vous n'avez pas mentionné ce que version vous utilisez ...)

16
marc_s

utilisez ceci (supposez que votre nom de table est des e-mails):

select * from emails as a 
inner join  
(select EmailAddress, min(Id) as id from emails 
group by EmailAddress ) as b 
on a.EmailAddress = b.EmailAddress 
and a.Id = b.id

j'espère que cette aide ..

2
Setmax

Je ne suis pas sûr de votre SGBD. J'ai donc créé une table temporaire dans Redshift et d'après mon expérience, je pense que cette requête devrait retourner ce que vous recherchez:

select min(Id), distinct MailId, EmailAddress, Name
    from yourTableName
    group by MailId, EmailAddress, Name

Je constate que j'utilise un GROUP BY clause mais vous n'aurez toujours pas deux lignes contre un MailId particulier.

0
Satyarth Shankar