仅一列的DISTINCT

假设我有以下查询。

SELECT ID, Email, ProductName, ProductModel FROM Products

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

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

DISTINCTGROUP BY这样的子句似乎对整行起作用。所以我不知道该怎么做。

380751 次浏览

如果您使用的是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

DISTINCTGROUP BY对整行起作用的原因是您的查询返回整行。

为了帮助您理解:尝试手动写出查询应该返回的内容,您将看到在非重复列中放置的内容不明确。

如果您确实不关心其他列中的内容,请不要返回它们。对我来说,为每个电子邮件地址返回一个随机行似乎有点没用。

这假设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列,如果您想返回最后一个,那么我建议您这样做:

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

TOP 1将只返回第一条记录,通过按ID降序排序,它将返回最后一行在前的结果。这将为您提供最后一条记录。

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

例如,您有以下表格:

Cliente||Nombres||电子邮件

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

123||约翰·康纳||s.connor@skynet.com.

125||莎拉·康纳||s.connor@skynet.com.

并且您只需要选择不同的邮件。 你可以这样做:

SQL选择:

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;

您可以使用它来选择最大ID,与该最大ID对应的名称,您可以通过这种方式添加任何其他属性。最后,将非重复列放入筛选器中,并仅将其与最后一个非重复列分组。

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

此SELECT将返回:

Cliente||Nombres||电子邮件

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

125||莎拉·康纳||s.connor@skynet.com.

记住要索引您选择的列,并且DISTINCT列必须没有大写或小写的数字数据,否则它将不起作用。 这也只适用于一封挂号邮件。 快乐编码!

您可以通过使用GROUP BY来覆盖它,如下所示:

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

试试这个

;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

试试这个:

SELECT ID, Email, ProductName, ProductModel FROM Products WHERE ID IN (SELECT MAX(ID) FROM Products GROUP BY Email)