как выбирать строки только на основе различных значений A COLUMN

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

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

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

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

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

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

Изменить: я также не могу использовать ключевое слово "Группировать по", потому что для этого мне также придется группировать по с идентификатором (который является ПК), и при этом будут возвращены две строки с одинаковыми значениями EmailAddress. но с разными идентификаторами.


person user576510    schedule 17.09.2011    source источник
comment
почему бы вам не использовать только GROUP BY EmailAddress ... если вы группируете по своему PK, он ничего не сделает, потому что первичный ключ всегда уникален, поэтому группа по оператору ничего не сделает ... если вы используете группу по emailAddress, вы получите то же самое результаты, как вы указали ...   -  person blejzz    schedule 17.09.2011
comment
Кажется, вы хотите выбрать разные EmailAddress и Name и первый соответствующий идентификатор MailId для этих двух. Это верно? Мне также любопытно, как будут использоваться Id и MailId.   -  person Miserable Variable    schedule 17.09.2011
comment
Группировка по первичному ключу не имеет смысла. Группировка удаляет повторяющиеся значения. Первичные ключи по определению не могут иметь дубликатов.   -  person Thilo    schedule 18.09.2011
comment
Я думаю, что вы хотите сгруппировать по адресу электронной почты и имени, затем найти min (mailID), затем соответствующий идентификатор   -  person Beth    schedule 20.09.2016


Ответы (5)


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

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

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

person danishgoel    schedule 17.09.2011
comment
Я думаю, вам нужно включить поле имени, а не только адрес электронной почты, хотя у него нет такого примера. - person Beth; 20.09.2016

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

;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 и новее (вы не упомянули, какую версию вы используете ...)

person marc_s    schedule 17.09.2011

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

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

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

person Setmax    schedule 26.07.2014

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

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

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

person Satyarth Shankar    schedule 20.09.2016

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

 SELECT * FROM myTABLE GROUP BY EmailAddress
person blejzz    schedule 17.09.2011
comment
см. мой комментарий, мой ответ возвращает желаемые результаты. - person blejzz; 17.09.2011
comment
он возвращает ошибку Msg 8120, уровень 16, состояние 1, строка 1 Столбец «EmailContact.RowId» недопустим в списке выбора, поскольку он не содержится ни в агрегатной функции, ни в предложении GROUP BY. - person user576510; 17.09.2011