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