DISTINCT只有一列

Jon*_*ood 145 sql sql-server

假设我有以下查询.

SELECT ID, Email, ProductName, ProductModel FROM Products
Run Code Online (Sandbox Code Playgroud)

如何修改它以使其不返回重复的电子邮件?

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

类似条款DISTINCT,并GROUP BY出现在整个行工作.所以我不确定如何处理这个问题.

Cha*_*ndu 172

如果您使用的是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
Run Code Online (Sandbox Code Playgroud)

编辑:使用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
Run Code Online (Sandbox Code Playgroud)

  • 我必须调查这个PARTITION条款,之前从未见过它.谢谢你的例子 (3认同)

Per*_* P. 10

这假定SQL Server 2005+和您对"last"的定义是给定电子邮件的最大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
Run Code Online (Sandbox Code Playgroud)


小智 6

你可以通过使用GROUP BY函数来完成它

SELECT ID, Email, ProductName, ProductModel FROM Products GROUP BY Email
Run Code Online (Sandbox Code Playgroud)

  • 列'Products.ID'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中. (13认同)
  • 在 postgres 中,您只需要将在 group by 子句中使用的列上的聚合函数,例如`SELECT id, max(email) AS email FROM tbl GROUP by email`。在 SQL Server 中,`SELECT` 子句中的所有列都必须在聚合函数中。每次我回去都会咬我。 (3认同)
  • 如果不为其他列使用MAX(ID),MAX(ProductName),MAX(ProductModel)之类的方法,这将无法正常工作 (2认同)

jon*_*aze 5

当你使用DISTINCT它作为一个独特的行,而不是列.它将仅返回列不完全匹配的行.

SELECT DISTINCT ID, Email, ProductName, ProductModel
FROM Products

----------------------
1 | something@something.com | ProductName1 | ProductModel1
2 | something@something.com | ProductName1 | ProductModel1
Run Code Online (Sandbox Code Playgroud)

查询将返回两行,因为ID列不同.我假设ID列是一个IDENTITY递增的列,如果你想返回最后一个,那么我推荐这样的东西:

SELECT DISTINCT TOP 1 ID, Email, ProductName, ProductModel
FROM Products
ORDER BY ID DESC
Run Code Online (Sandbox Code Playgroud)

TOP 1会只返回第一个记录,由责令ID下降,会先返回的结果与最后一排.这将给你最后一条记录.

  • 如问题中所述,我看到DISTINCT适用于整行。我想像您上面建议的那样做,但是每次在结果中重复一封电子邮件(不只是一次)。 (2认同)