Подтвердить что ты не робот

Как выбирать строки, основанные только на отдельных значениях 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

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

Ответ 3

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

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

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

Ответ 4

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

 SELECT * FROM myTABLE GROUP BY EmailAddress

Ответ 5

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

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

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