假设我有以下查询。
SELECT ID, Email, ProductName, ProductModel FROM Products
如何修改它,使其不返回重复的电子邮件?
换句话说,当几行包含同一封电子邮件时,我希望结果仅包含这些行之一(最好是最后一行)。在其他列中应允许重复。
子句喜欢DISTINCT并且GROUP BY似乎在整个行上都起作用。所以我不确定该如何处理。
假设我有以下查询。
SELECT ID, Email, ProductName, ProductModel FROM Products
如何修改它,使其不返回重复的电子邮件?
换句话说,当几行包含同一封电子邮件时,我希望结果仅包含这些行之一(最好是最后一行)。在其他列中应允许重复。
子句喜欢DISTINCT并且GROUP BY似乎在整个行上都起作用。所以我不确定该如何处理。
Answers:
如果您使用的是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
SELECT需要一个WHERE条件。我在想将行号分配给表中的所有行。这种语法超出了我一点。是否有可能保证某行符合WHERE条件的特定更新的更新机会?
JOIN s 时,我才能正常工作。一旦有了a JOIN,ROW_NUMBER返回的值就比“ 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下降,会先返回的结果与最后一排。这将给您最后的记录。
您可以使用GROUP BY函数
SELECT ID, Email, ProductName, ProductModel FROM Products GROUP BY Email
SELECT id, max(email) AS email FROM tbl GROUP by email。在SQL Server中,SELECT子句中的ALL列必须在聚合函数中。每当我回去时,这都会刺痛我。
对于Access,可以使用我在此处显示的SQL Select查询:
例如,您有此表:
888 || T800阿诺德|| t800.arnold@cyberdyne.com
123 || 约翰·康纳|| s.connor@skynet.com
125 || SARAH CONNOR ||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或任何其他函数,然后将该函数复制到子查询中。
该选择将返回:
888 || T800阿诺德|| t800.arnold@cyberdyne.com
125 || SARAH CONNOR ||s.connor@skynet.com
请记住为选定的列建立索引,并且不同的列必须全部没有大写或小写数字数据,否则它将不起作用。这也仅适用于一封已注册的邮件。编码愉快!!!
原因DISTINCT和GROUP BY在整个行的工作是你的查询返回整行。
为了帮助您理解:尝试手动写出查询应返回的内容,您将发现在非重复列中放置内容是不明确的。
如果您实际上不关心其他列中的内容,请不要返回它们。对每个电子邮件地址返回随机行对我来说似乎没有用。
试试这个:
SELECT ID, Email, ProductName, ProductModel FROM Products WHERE ID IN (SELECT MAX(ID) FROM Products GROUP BY Email)