как выбрать строки, основанные только на различных значениях столбца A COLUMN - PullRequest
26 голосов
/ 17 сентября 2011

Мне нужно запросить таблицу, чтобы вернуть строки, но я не могу правильно запросить таблицу. Вот мой вид таблицы:

Id                MailId          EmailAddress          Name
1                 1               a@a.com               Mr. A
2                 1               b@b.com               Mr. B
3                 1               c@c.com               Mr. C
4                 1               d@d.com               Mr. D
5                 1               a@a.com               Mr. A
6                 2               e@e.com               Mr. E
7                 2               a@a.com               Mr. A
8                 3               f@f.com               Mr. F
9                 4               d@d.com               Mr. D  
10                5               f@f.com               Mr. F
11                6               d@d.com               Mr. D

Набор результатов должен возвращать:

Id                MailId          EmailAddress          Name
1                 1               a@a.com               Mr. A
2                 1               b@b.com               Mr. B
3                 1               c@c.com               Mr. C
4                 1               d@d.com               Mr. D
6                 2               e@e.com               Mr. E
8                 3               f@f.com               Mr. F

Другими словами: сначала я хочу выбрать разные адреса электронной почты, а затем вернуть строки, содержащие разные адреса электронной почты.

Примечание: Простое использование ключевого слова "Distinct" здесь не сработает, так как выберет отдельные строки. Мое требование - выбрать отдельные адреса электронной почты, а затем выбрать строки, содержащие эти адреса.

Редактировать: Я также не могу использовать ключевое слово "Group By", потому что для этого мне также придется сгруппировать By с Id (который является PK), и при этом будут возвращены две строки с одинаковым Значения EmailAddress, но с разными идентификаторами.

Ответы [ 5 ]

55 голосов
/ 17 сентября 2011

Глядя на ваш вывод, может быть, следующий запрос может сработать, попробуйте:

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

Это выберет только одну строку для каждого отдельного адреса электронной почты, строку с минимальным значением id, которое, как кажется, отображает ваш результат

16 голосов
/ 17 сентября 2011

Попробуйте: вам нужен CTE (Common Table Expression), который разбивает (группирует) ваши данные по разным адресам электронной почты и сортирует каждую группу по ID - сначала наименьший.Затем вы просто выбираете первую запись для каждой группы - это должно дать вам то, что вы ищете:

;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

Это работает на SQL Server 2005 и новее (вы этого не сделалиупомяните, какую версию вы используете ...)

2 голосов
/ 26 июля 2014

используйте это (предположим, что ваше имя таблицы - электронные письма):

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

надеюсь, что это поможет ..

0 голосов
/ 20 сентября 2016

Я не уверен насчет вашей СУБД. Итак, я создал временную таблицу в Redshift и, исходя из своего опыта, я думаю, что этот запрос должен вернуть то, что вы ищете:

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

Я вижу, что я использую GROUP BY clause, но у вас все равно не будет двух строк против какого-либо конкретного MailId.

0 голосов
/ 17 сентября 2011

если вы не хотите использовать DISTINCT, используйте GROUP BY

 SELECT * FROM myTABLE GROUP BY EmailAddress
...