2017-03-22 36 views
0

我有了SQL查询删除重复值

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 

通知查询删除第一条记录,并保持最后的重复值的。

我perfer结果是

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 

回答

0

如果你是最低的公司的价值后,这将工作:

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 
+0

谢谢第一次工作。 –

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 
0

可以使用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) 
0

只是为了显示你的另一种方法,使用表对自身内部联接:

-- 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