【问题标题】:SQL Server Duplicate CheckingSQL Server 重复检查
【发布时间】:2010-09-07 23:48:22
【问题描述】:

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

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

样本数据:

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

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    类似的东西

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

    【讨论】:

      【解决方案2】:

      尝试类似:

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

      http://www.technicaloverload.com/working-with-duplicates-in-sql-server/

      【讨论】:

        【解决方案3】:

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

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

        甚至可以使用电子邮件和 ID 字段。并返回e-mail相同且ID不同的条目。 (为避免重复,请勿使用 != 而是使用 。)

        【讨论】:

          【解决方案4】:
          SELECT [id], [receivedate], [email]
          FROM [mytable]
          WHERE [email] IN ( SELECT [email]
              FROM [myTable]
              GROUP BY [email]
              HAVING COUNT([email]) > 1 )
          

          【讨论】:

            【解决方案5】:

            您想要最后一项的列表吗?如果是这样,您可以使用:

            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
            

            如果您想要最后一封重复的电子邮件(单个结果),您只需添加“TOP 1”和“ORDER BY”:

            SELECT TOP 1 [info] FROM [table] GROUP BY [email] HAVING Count(*) > 1 ORDER BY Date DESC
            

            【讨论】:

              【解决方案6】:

              如果你有代理键,使用 SQLMenance 帖子中提到的 group by 语法相对容易。本质上,按使两行或多行“相同”的所有字段分组。

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

              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
              )
              

              【讨论】:

                【解决方案7】:

                试试这个

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

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2012-11-01
                  • 1970-01-01
                  • 2015-06-30
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多