Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server重复检查_Sql_Sql Server - Fatal编程技术网

SQL Server重复检查

SQL Server重复检查,sql,sql-server,Sql,Sql Server,确定SQL Server表中重复记录的最佳方法是什么 例如,我想在表中查找收到的最后一封重复电子邮件(表中有主键、receiveddate和电子邮件字段) 样本数据: 1 01/01/2008 stuff@stuff.com 2 02/01/2008 stuff@stuff.com 3 01/12/2008 noone@stuff.com 您不能加入电子邮件字段的列表,然后查看结果中的空值吗 或者更好的是,计算每个电子邮件地址的实例?并且只返回计数大于1的值 甚至可以选择电子邮件和id字

确定SQL Server表中重复记录的最佳方法是什么

例如,我想在表中查找收到的最后一封重复电子邮件(表中有主键、receiveddate和电子邮件字段)

样本数据:

1  01/01/2008 stuff@stuff.com
2  02/01/2008 stuff@stuff.com
3  01/12/2008 noone@stuff.com

您不能加入电子邮件字段的列表,然后查看结果中的空值吗

或者更好的是,计算每个电子邮件地址的实例?并且只返回计数大于1的值

甚至可以选择电子邮件和id字段。并返回电子邮件相同、ID不同的条目。(为了避免重复,不要使用!=而是

类似的东西

select email ,max(receiveddate) as MaxDate
from YourTable
group by email 
having count(email) > 1
试试这个

select * from table a, table b
where a.email = b.email

你想要最后几项的清单吗?如果是这样,您可以使用:

SELECT [info] FROM [table] t WHERE NOT EXISTS (SELECT * FROM [table] tCheck WHERE t.date > tCheck.date)
如果您想要所有重复电子邮件地址的列表,请使用GROUP BY收集类似数据,然后使用HAVING子句确保数量大于1:

SELECT [info] FROM [table] GROUP BY [email] HAVING Count(*) > 1 DESC
如果您想要最后一封重复的电子邮件(单一结果),只需添加“前1名”和“订购人”:


如果您有代理键,那么使用SQLMenance文章中提到的GROUPBY语法相对容易。本质上,按使两行或多行“相同”的所有字段分组

删除重复记录的示例伪代码

Create table people (ID(PK), Name, Address, DOB)

Delete from people where id not in (
Select min(ID) from people group by name, address, dob
)
尝试以下方法:

SELECT * FROM (
  SELECT *, 
  ROW_NUMBER() OVER (PARTITION BY ReceivedDate, Email ORDER BY ReceivedDate, Email DESC) AS RowNumber 
  FROM EmailTable
) a
WHERE RowNumber = 1

Create table people (ID(PK), Name, Address, DOB)

Delete from people where id not in (
Select min(ID) from people group by name, address, dob
)
SELECT * FROM (
  SELECT *, 
  ROW_NUMBER() OVER (PARTITION BY ReceivedDate, Email ORDER BY ReceivedDate, Email DESC) AS RowNumber 
  FROM EmailTable
) a
WHERE RowNumber = 1