当前位置: 代码迷 >> Sql Server >> 求教,两天都没有解决,关于三个表连接之后的数据去除重复的有关问题
  详细解决方案

求教,两天都没有解决,关于三个表连接之后的数据去除重复的有关问题

热度:13   发布时间:2016-04-24 20:19:20.0
求教,急!两天都没有解决,关于三个表连接之后的数据去除重复的问题。
本帖最后由 liao_1000 于 2013-10-09 16:04:10 编辑
关于三个表连接之后的数据去除重复的问题。
一、CUST表(用于记录公司):
NO(公司编号),COM(公司名)
1           公司A
2           公司B
3           公司C   

二、LM表(用于记录公司的联系人,一个公司多个联系人):
NO(公司编号),M_LINK(联系人)
1       张1   
1       李2   
1       何3   
2       赵4 
2       王5  
2       钱6   
3       李7  


三、LOG表(用于记录联系日志):
NO(公司编号),G_LINK(联系人名),TIME(时间)
1   张1   2013/09/12
1   李2   2013/10/12
1   李2   2013/10/12(有可能跟上一条完全相同的,怎么去重?)
2   赵4   2013/11/11
2   王5   2013/11/11(可能时间相同,人不同)
2   钱6   2013/08/03
3   李7   2013/11/11
1   张1   2013/09/11

三个表连接之后的数据去除重复想得到的效果是:只出现每个公司的一个联系人的其中一个最新日志记录

COM(公司名),LINK(联系人名),TIME(时间)
 
 公司A  李2   2013/10/12
 
 公司B  赵4   2013/11/11

 公司C  李7   2013/11/11
多表连接 去重

------解决方案--------------------
create table CUST
(
no int,
com nvarchar(10)
)
go
create table LM
(
no int,
com nvarchar(10),
M_LINK nvarchar(10)
)
go

create table [LOG]
(
no int,
M_LINK nvarchar(10),
TIME datetime
)
go

insert into cust values(1,'公司A')
insert into cust values(2,'公司B')
insert into cust values(3,'公司C')
insert into lm values(1,'公司A','张1')
insert into lm values(1,'公司A','李2')
insert into lm values(1,'公司A','何3')
insert into lm values(2,'公司B','赵4')
insert into lm values(2,'公司B','王5')
insert into lm values(2,'公司B','钱6')
insert into lm values(3,'公司C','李7')

insert into [log] values(1,'张1','2013/09/12')
insert into [log] values(2,'李2','2013/10/12')
insert into [log] values(3,'李2','2013/10/12')
insert into [log] values(4,'赵4','2013/11/11')
insert into [log] values(5,'王5','2013/11/11')
insert into [log] values(6,'钱6','2013/08/03')
insert into [log] values(7,'李7','2013/11/11')
insert into [log] values(8,'张1','2013/09/11')

select b.com,b.m_link,max(c.time) from lm b,
[log] c 
where b.m_link = c.m_link
group by b.com,b.m_link

------解决方案--------------------
;with CUST(NO,COM) as
(
select 1,'公司A'
union all select 2,'公司B'
union all select 3,'公司C'
),
LM(NO,COM,M_LINK) as
(
select 1,'公司A','张1'
union all select 1,'公司A','李2'
union all select 1,'公司A','何3'
union all select 2,'公司B','赵4'
union all select 2,'公司B','王5'
union all select 2,'公司B','钱6'
union all select 3,'公司C','李7'
),
[LOG](NO,G_LINK,[TIME]) AS
(
select 1,'张1','2013/09/12'
union all select 2,'李2','2013/10/12'
union all select 3,'李2','2013/10/12'
union all select 4,'赵4','2013/11/11'
union all select 5,'王5','2013/11/11'
union all select 6,'钱6','2013/08/03'
union all select 7,'李7','2013/11/11'
union all select 8,'张1','2013/09/11'
)
select COM,M_LINK,[time]
from 
(select a.*,b.TIME,rn=ROW_NUMBER() over(partition by a.com order by b.time desc)
from LM a
left join [LOG] b on a.M_LINK=b.G_LINK
)t
where rn=1

/*
COM M_LINK time
---------------------
公司A 李2 2013/10/12
公司B 赵4 2013/11/11
公司C 李7 2013/11/11
*/

------解决方案--------------------

create table CUST
(NO int,COM varchar(10))
 
insert into CUST
 select 1, '公司A' union all
 select 2, '公司B' union all
  相关解决方案