MyException - 我的异常网
当前位置:我的异常网» Sql Server » 请大侠们看看,SQL整理重复数据,该如何解决

请大侠们看看,SQL整理重复数据,该如何解决

www.MyException.Cn  网友分享于:2013-06-16  浏览:9次
请大侠们看看,SQL整理重复数据
SQL code

CustomerID ChName    Mobile    Address CardID LinkMan LinkMobile  CreateDate 
120612001  王小二     NULL      NULL   000781  NULL     NULL       2011-12-3 
120612002  XXXX公司 13656778787 Null   000781  NULL   13566677981  2010-9-10 
120612003  yyyy公司   Null      上海   000781  王斯   13466677881       NULL 
120612004  zzzz公司 13466677881 北京   000781  NULL     NULL       2011-9-10 
120612005  李雷       Null      上海   000782  张三   13466677882       NULL 
120612006  GGGG公司 13466677882 广州   000782  NULL     NULL            NUll 
120612007  张兵       Null      上海   000783  Jim    13466677883       NULL 
120612008  张兵     13466677885 NULL   000783  NULL     NULL       2010-9-1 
120612009  张兵     13466677886 天津   000783  NULL   13866654566       NULL 

条件:1.CardID唯一 
            2.CardID相同记录中,如果其中存在CreateDate不为空,那么保留距今天最近的一条; 
                如果CardID相同记录中CreateDate都为空则包里Mobile不为空的数据   
            3.保留的记录中,如果这条记录中字段为空那么取CardID相同记录中其他不为空的数据, 
                如果其中存在多条不为空的记录,取值也是按CreateDate距今最近的不为空的值,   
                若CreateDate都为空,则取Mobile不为空的一条中该字段不为空的值 ,
                若Mobile都为空,则取CustomerID值最大的那条记录中该字段不为空的值
            
希望通过sql语句整理后,customerinfo表中保留的结果如下: 
CustomerID  ChName     Mobile   Address CardID LinkMan LinkMobile  CreateDate 
120612001  王小二   13466677881  北京   000781  王斯   13566677981 2011-12-3 
120612006  GGGG公司 13466677882  广州   000782  张三   13466677882      NUll 
120612008  张兵     13466677885  天津   000783  Jim    13866654566  2010-9-1 
将其他数据删除,并将删除的数据保存到与customerinfo表结构相同的表tempinfo中
(数据有很多,只选取了具有代表性的几条数据)



------解决方案--------------------
SQL code
if object_id('[tb]') is not null drop table [tb]
go
create table [tb]([CustomerID] int,[ChName] varchar(8),[Mobile] bigint,[Address] varchar(4),[CardID] varchar(6),[LinkMan] varchar(4),[LinkMobile] bigint,[CreateDate] datetime)
insert [tb]
select 120612001,'王小二',null,null,'000781',null,null,'2011-12-3' union all
select 120612002,'XXXX公司',13656778787,null,'000781',null,13566677981,'2010-9-10' union all
select 120612003,'yyyy公司',null,'上海','000781','王斯',13466677881,null union all
select 120612004,'zzzz公司',13466677881,'北京','000781',null,null,'2011-9-10' union all
select 120612005,'李雷',null,'上海','000782','张三',13466677882,null union all
select 120612006,'GGGG公司',13466677882,'广州','000782',null,null,null union all
select 120612007,'张兵',null,'上海','000783','Jim',13466677883,null union all
select 120612008,'张兵',13466677885,null,'000783',null,null,'2010-9-1' union all
select 120612009,'张兵',13466677886,'天津','000783',null,13866654566,null
go

select * from tb t
where CustomerID=(select top 1 CustomerID  from tb where CardID=t.CardID
 order by 
  CreateDate desc,
  Mobile desc,
  CustomerID desc
)
  
/**
CustomerID  ChName   Mobile               Address CardID LinkMan LinkMobile           CreateDate
----------- -------- -------------------- ------- ------ ------- -------------------- -----------------------
120612001   王小二      NULL                 NULL    000781 NULL    NULL                 2011-12-03 00:00:00.000
120612006   GGGG公司   13466677882          广州      000782 NULL    NULL                 NULL
120612008   张兵       13466677885          NULL    000783 NULL    NULL                 2010-09-01 00:00:00.000

(3 行受影响)
**/

------解决方案--------------------
SQL code

--> 测试数据:[test]
if object_id('[test]') is not null 
drop table [test]
create table [test](
[CustomerID] int,
[ChName] varchar(8),
[Mobile] bigint,
[Address] varchar(4),
[CardID] varchar(6),
[LinkMan] varchar(4),
[LinkMobile] bigint,
[CreateDate] datetime
)
insert [test]
select 120612001,'王小二',null,null,'000781',null,null,'2011-12-3' union all
select 120612002,'XXXX公司',13656778787,null,'000781',null,13566677981,'2010-9-10' union all
select 120612003,'yyyy公司',null,'上海','000781','王斯',13466677881,null union all
select 120612004,'zzzz公司',13466677881,'北京','000781',null,null,'2011-9-10' union all
select 120612005,'李雷',null,'上海','000782','张三',13466677882,null union all
select 120612006,'GGGG公司',13466677882,'广州','000782',null,null,null union all
select 120612007,'张兵',null,'上海','000783','Jim',13466677883,null union all
select 120612008,'张兵',13466677885,null,'000783',null,null,'2010-9-1' union all
select 120612009,'张兵',13466677886,'天津','000783',null,13866654566,null

with t
as(
select *,
px=ROW_NUMBER()over(partition by [CardID] order by [CreateDate] desc,Mobile desc)
from test
)
select 
    CustomerID,
    ChName,
    isnull(Mobile,(select Mobile from t b 
    where b.[CustomerID]=(select max([CustomerID]) from t c where c.[CardID]=a.[CardID]))) as Mobile,
    isnull([address],(select [address] from t b 
    where b.[CustomerID]=(select max([CustomerID]) from t c where c.[CardID]=a.[CardID]))) as [address],
    CardID,
    isnull([LinkMan],(select [LinkMan] from t b 
    where b.[CustomerID]=(select max([CustomerID]) from (
    select * from t where [LinkMan] is not null
    ) c where c.[CardID]=a.[CardID]))) as [LinkMan],
    isnull([LinkMobile],(select [LinkMobile] from t b 
    where b.[CustomerID]=(select max([CustomerID]) from (select * from t where [LinkMobile] is not null) c 
    where c.[CardID]=a.[CardID]))) as [LinkMobile],
    CreateDate
from 
    t a 
where 
    px=1
/*
CustomerID    ChName    Mobile    address    CardID    LinkMan    LinkMobile    CreateDate
120612001    王小二    13466677881    北京    000781    王斯    13466677881    2011-12-03 00:00:00.000
120612006    GGGG公司    13466677882    广州    000782    张三    13466677882    NULL
120612008    张兵    13466677885    天津    000783    Jim    13866654566    2010-09-01 00:00:00.000
*/

文章评论

程序员应该关注的一些事儿
程序员应该关注的一些事儿
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
我是如何打败拖延症的
我是如何打败拖延症的
漫画:程序员的工作
漫画:程序员的工作
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
程序员和编码员之间的区别
程序员和编码员之间的区别
如何成为一名黑客
如何成为一名黑客
每天工作4小时的程序员
每天工作4小时的程序员
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
10个调试和排错的小建议
10个调试和排错的小建议
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
程序员都该阅读的书
程序员都该阅读的书
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
鲜为人知的编程真相
鲜为人知的编程真相
Java程序员必看电影
Java程序员必看电影
 程序员的样子
程序员的样子
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
旅行,写作,编程
旅行,写作,编程
总结2014中国互联网十大段子
总结2014中国互联网十大段子
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
为什么程序员都是夜猫子
为什么程序员都是夜猫子
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
编程语言是女人
编程语言是女人
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
程序员的鄙视链
程序员的鄙视链
那些争议最大的编程观点
那些争议最大的编程观点
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
老程序员的下场
老程序员的下场
程序员必看的十大电影
程序员必看的十大电影
一个程序员的时间管理
一个程序员的时间管理
代码女神横空出世
代码女神横空出世
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
我的丈夫是个程序员
我的丈夫是个程序员
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有