DISTINCT只有一个列

假设我有以下查询。

SELECT ID, Email, ProductName, ProductModel FROM Products 

我怎样才能修改它,使它没有重复的电子邮件?

换句话说,当多行包含相同的电子邮件时,我希望结果只包含其中的一行(最好是最后一行)。 应该允许在其他列中复制。

DISTINCTGROUP BY这样的GROUP BY似乎可以在整行上工作。 所以我不知道如何解决这个问题。

如果您正在使用SQL Server 2005或更高版本,请使用以下命令:

 SELECT * FROM ( SELECT ID, Email, ProductName, ProductModel, ROW_NUMBER() OVER(PARTITION BY Email ORDER BY ID DESC) rn FROM Products ) a WHERE rn = 1 

编辑:使用where子句的示例:

 SELECT * FROM ( SELECT ID, Email, ProductName, ProductModel, ROW_NUMBER() OVER(PARTITION BY Email ORDER BY ID DESC) rn FROM Products WHERE ProductModel = 2 AND ProductName LIKE 'CYBER%' ) a WHERE rn = 1 

这假设SQL Server 2005+和您的定义“最后”是给定的电子邮件的最大PK

 ;WITH CTE AS ( SELECT ID, Email, ProductName, ProductModel, ROW_NUMBER() OVER (PARTITION BY Email ORDER BY ID DESC) AS RowNumber FROM Products ) SELECT ID, Email, ProductName, ProductModel FROM CTE WHERE RowNumber = 1 

当您使用DISTINCT ,将其视为不同的行,而不是列。 它将仅返回列不匹配的行完全相同。

 SELECT DISTINCT ID, Email, ProductName, ProductModel FROM Products ---------------------- 1 | something@something.com | ProductName1 | ProductModel1 2 | something@something.com | ProductName1 | ProductModel1 

该查询将返回两个行,因为ID列是不同的。 我假设ID列是增量的IDENTITY列,如果你想返回最后那么我build议这样的事情:

 SELECT DISTINCT TOP 1 ID, Email, ProductName, ProductModel FROM Products ORDER BY ID DESC 

TOP 1将只返回第一条logging,通过ID降序排列它将返回最后一行的结果。 这会给你最后的logging。

对于Access,您可以使用我在这里提供的SQL Select查询:

比如你有这个表格:

CLIENTE || NOMBRES || 邮件

888 || T800 ARNOLD || t800.arnold@cyberdyne.com

123 || JOHN CONNOR || s.connor@skynet.com

125 || SARAH CONNOR ||s.connor@skynet.com

而且你只需要select不同的邮件。 你可以这样做:

SQL SELECT:

 SELECT MAX(p.CLIENTE) AS ID_CLIENTE , (SELECT TOP 1 x.NOMBRES FROM Rep_Pre_Ene_MUESTRA AS x WHERE x.MAIL=p.MAIL AND x.CLIENTE=(SELECT MAX(l.CLIENTE) FROM Rep_Pre_Ene_MUESTRA AS l WHERE x.MAIL=l.MAIL)) AS NOMBRE, p.MAIL FROM Rep_Pre_Ene_MUESTRA AS p GROUP BY p.MAIL; 

你可以使用这个来select最大的ID,对应的名字到那个最大的ID,你可以用这种方式添加任何其他的属性。 然后在最后,将不同的列进行过滤,并且只将其与最后一个不同的列进行分组。

这将为您带来与对应数据最大的ID,您可以使用min或任何其他函数,并将该函数复制到子查询中。

这个select将返回:

CLIENTE || NOMBRES || 邮件

888 || T800 ARNOLD || t800.arnold@cyberdyne.com

125 || SARAH CONNOR ||s.connor@skynet.com

请记住索引您select的列,并且不同的列必须不包含大写或小写的数字数据,否则将无法工作。 这也只适用于一个挂号邮件。 快乐编码!

你可以通过使用GROUP BYfunction

 SELECT ID, Email, ProductName, ProductModel FROM Products GROUP BY Email 

DISTINCTGROUP BY在整行上工作的原因是您的查询返回整行。

为了帮助你理解:试着手工写出查询应该返回的内容,你会发现在非重复列中放置什么是模糊的。

如果你真的不在意别的栏目是什么,不要退还。 为每个电子邮件地址返回一个随机行似乎对我来说有点无用。

尝试这个

 ;With Tab AS (SELECT DISTINCT Email FROM Products) SELECT Email,ROW_NUMBER() OVER(ORDER BY Email ASC) AS Id FROM Tab ORDER BY Email ASC