日期:2014-05-19  浏览次数:20431 次

合并记录:每条记录中除时间不同外,其他部分基本相同,将其合并成同一条记录
rt
示例数据如下:
字段:
A B begintime endtime
a b 2006-02-01   2006-02-28  
a b 2006-03-01   2006-03-31  

表中的大部分记录如上所示,除begintime   ,endtime不同之外其他部分基本相同,begintime,endtime无重复

现想得到如下的合并后的数据,即取A,B字段相同的记录中最小的begintime作为合并后的begintime,最大的endtime作为合并后的endtime;相同部分照搬

A B begintime endtime
a b 2006-02-01   2006-03-31  




------解决方案--------------------
select A, B, begintime =min(begintime), endtime=max(endtime)
from 表名
group by a,b
------解决方案--------------------
select A,B,min(begintime) as begintime,max(endtime) as endtime
from t
group by A,B
------解决方案--------------------
select A, B,[begintime]=min(begintime),[endtime]=max(endtime)
from 表名
group by a,b

------解决方案--------------------
group by a,b是合并
min最小了,max最大

------解决方案--------------------
--创建测试环境
create table t(A varchar(10),B varchar(10),begintime datetime,endtime datetime,flag int)

--插入测试数据
insert t(A,B,begintime,endtime)
select 'a ', 'b ', '2006-02-01 ', '2006-02-28 ' union all
select 'a ', 'b ', '2006-03-01 ', '2006-03-31 ' union all
select 'a ', 'b ', '2006-04-02 ', '2006-04-21 '

--求解过程
declare @endtime datetime,@a varchar(10),@b varchar(10),@flag int
set @flag = 0

update t
set @flag = case when @a = a and @b = b and datediff(day,@endtime,begintime) = 1 then @flag else @flag + 1 end
,@endtime = endtime,@a = a,@b = b,flag = @flag

select A,B,min(begintime) as begintime,max(endtime) as endtime
from t
group by A,B,flag

--删除测试环境
drop table t

/*--测试结果
a b 2006-02-01 00:00:00.000 2006-03-31 00:00:00.000
a b 2006-04-02 00:00:00.000 2006-04-21 00:00:00.000

*/


------解决方案--------------------
declare @t table(A varchar(4),B varchar(4),begintime datetime,endtime datetime)
insert into @t select 'a ', 'b ', '2006-02-01 ', '2006-02-28 '
insert into @t select 'a ', 'b ', '2006-03-01 ', '2006-03-31 '

select
a.A,a.B,a.begintime,min(b.endtime) as endtime
from
(select t.A,t.B,t.begintime from @t t where not exists(select 1 from @t where endtime=t.begintime-1)) a,
(select t.A,t.B,t.endtime from @t t where not exists(select 1 from @t where begintime=t.endtime+1)) b
where
a.A=b.A and a.B=b.B and a.begintime <=b.endtime
group by
a.A,a.B,a.begintime

/*
A B begintime endtime
---- ---- ----------------------- -----------------------
a b 2006-02-01 00:00:00.000 2006-03-31 00:00:00.000
*/