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)
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 EmailRun Code Online (Sandbox Code Playgroud)
当你使用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下降,会先返回的结果与最后一排.这将给你最后一条记录.