【问题标题】:SQL Query for removing duplicate values用于删除重复值的 SQL 查询
【发布时间】:2017-03-22 19:59:26
【问题描述】:

我有一张桌子

Account, CompanyID, Mail_Address
1001,1,Main ST
1001,2,Main ST
1001,3,Florida ST
1002,1,South Main
1002,2,West Main
1002,3,Soth Main
1003,1,North Main
1003,2,North Main

我需要创建一个删除重复 Mail_Address 的查询,这很简单。问题是返回的结果是最后一个重复值,而不是第一个重复值。

如果我的桌子是上面的 结果将是

 Account, CompanyID, Mail_Address
    1001,2,Main ST
    1001,3,Florida ST
    1002,2,West Main
    1002,3,South Main
    1003,2,North Main

请注意,查询删除了第一条记录并保留了最后一条重复值。

我希望结果是这样的

 Account, CompanyID, Mail_Address
    1001,1,Main ST
    1001,3,Florida ST
    1002,1,South Main
    1002,2,West Main
    1003,1,North Main

我的查询

 SELECT *
  FROM (SELECT  [ACCOUNT]
      ,[COMPANY]
      ,[MAIL_ADDRESS]
      , 

      ROW_NUMBER() OVER(PARTITION BY Mail_Address ORDER BY Account ASC) rn
                    FROM [SQLUserDB].[dbo].[DSDD01]                 

              ) a
WHERE rn = 1 

【问题讨论】:

    标签: sql


    【解决方案1】:

    只需在ORDER BY 中添加另一个条件:

     SELECT *
      FROM (SELECT  [ACCOUNT]
          ,[COMPANY]
          ,[MAIL_ADDRESS]
          , 
    
          ROW_NUMBER() OVER(PARTITION BY Mail_Address ORDER BY Account ASC, CompanyID) rn
                        FROM [SQLUserDB].[dbo].[DSDD01]                 
    
                  ) a
    WHERE rn = 1 
    

    【讨论】:

      【解决方案2】:

      如果您追求最低的公司价值,这将起作用:

      SELECT Account, MIN(Company) as Company, Mail_Address
      FROM SqlUserDb.dbo.DSDD01
      GROUP BY Account, Mail_Address
      

      如果您追求的是首次上市的公司价值,这将做到,非常接近您所拥有的:

      SELECT Account, Company, Mail_Address
      FROM (
        SELECT Account, Company, Mail_Address,
          ROW_NUMBER() OVER(PARTITION BY Mail_Address ORDER BY Account, Company) CompanyRowNo
        FROM SqlUserDb.dbo.DSDD01
      ) x
      WHERE x.CompanyRowNo = 1
      

      【讨论】:

        【解决方案3】:

        您可以使用not exists实现您的意图:

        select Account, CompanyID, Mail_Address
        FROM [SQLUserDB].[dbo].[DSDD01] t1
        where not exists (select 1
                          from [SQLUserDB].[dbo].[DSDD01] t2
                          where t1.Mail_Address = t2.Mail_Address and t2.CompanyID < t1.CompanyID)
        

        【讨论】:

          【解决方案4】:

          只是向您展示另一种方式,在自身上使用 table 的内部连接:

          -- List Mail_Address to Delete
          select t1.Account, t1.CompanyID, t1.Mail_Address
          from [SQLUserDB].[dbo].[DSDD01] t1
          inner join [SQLUserDB].[dbo].[DSDD01] t2
          on t1.Account = t2.Account
          and t1.Mail_Address = t2.Mail_Address
          where t1.CompanyID > t2.Company_ID
          
          -- Delete Duplicate Mail_Address
          delete t1
          from [SQLUserDB].[dbo].[DSDD01] t1
          inner join [SQLUserDB].[dbo].[DSDD01] t2
          on t1.Account = t2.Account
          and t1.Mail_Address = t2.Mail_Address
          where t1.CompanyID > t2.Company_ID
          

          【讨论】:

            猜你喜欢
            • 2015-08-12
            • 1970-01-01
            • 2020-02-17
            • 1970-01-01
            • 2021-11-07
            • 1970-01-01
            • 1970-01-01
            • 2019-12-11
            • 2013-03-03
            相关资源
            最近更新 更多