假设我有以下查询。
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)