只有一列的DISTINCT?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (19)

假设我有以下查询。

SELECT ID, Email, ProductName, ProductModel FROM Products

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

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

类似的条款DISTINCTGROUP BY似乎可以在整行上工作。所以我不知道该怎么处理这件事。

提问于
用户回答回答于

如果你正在使用SQLServer 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
用户回答回答于

这假设SQLServer 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

扫码关注云+社区