繁体   English   中英

如何仅根据A COLUMN的不同值选择行

[英]how to select rows based on distinct values of A COLUMN only

我需要查询表以返回行,但我无法正确查询表。 这是我的表格视图:

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”关键字在此处不起作用,因为它将选择不同的行。 我的要求是选择不同的电子邮件地址,然后选择包含这些地址的行。

编辑:我也不能使用“分组依据”关键字,因为为此,我还必须使用ID(这是PK)进行分组,并且执行此操作将返回具有相同EmailAddress值但具有不同ID的两行。

查看您的输出可能以下查询可以工作,尝试一下:

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

这将为每个不同的电子邮件地址仅选择一行,具有最小id的行是您的结果似乎描绘的内容

试试这个 - 您需要一个CTE(公用表表达式),它通过不同的电子邮件地址对数据进行分区(分组),并按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及更新版本 (您没有提到您正在使用的版本 ......)

使用此(假设您的表名是电子邮件):

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

希望这有帮助..

我不确定你的DBMS。 所以,我在Redshift中创建了一个临时表,根据我的经验,我认为这个查询应该返回你想要的内容:

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

我看到我正在使用GROUP BY clause但你仍然没有针对任何特定MailId两行。

如果你不想使用DISTINCT使用GROUP BY

 SELECT * FROM myTABLE GROUP BY EmailAddress

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM