再问数据合并问题?谢谢

godhuang 2005-07-22 08:51:53
原帖:http://community.csdn.net/Expert/topic/4159/4159299.xml?temp=.5463373

如何实现下面的合并功能?
编号主叫 被叫 开始时间 结束时间
1 13777837123 10190 2005-6-16 1:55 2005-6-16 1:55
2 13777837123 2886612409 2005-6-16 1:55 2005-6-16 1:55
3 13777837123 101902 2005-6-20 18:28 2005-6-20 18:28
4 13777837123 13208118826 2005-7-4 10:19 2005-7-4 10:19

上面4条记录中1和2的主叫号码和结束时间一致,可合成一条记录,3和4则只能作为一条记录
主叫 被叫1 被叫 开始时间1 开始时间 结束时间
13777837123 101902 2886612409 2005-6-16 1:55 2005-6-16 1:55 2005-6-16 1:55
13777837123 101902 2005-6-20 18:28 2005-6-20 18:28 2005-6-20 18:28
13777837123 13208118826 2005-7-4 10:19 2005-7-4 10:19 2005-7-4 10:19

比如1和2条,同一个手机打的,不过是先拨10190转一下,再拨号码,所以开始时间应该会有间隔,但是etime算相同时间
第3条数据是拨10190后挂掉
第4条数据是直接拨号码

被叫1中存放合并数据后,如果原先记录中有10190的,则显示10190,否则显示空
被叫中存放合并数据后,显示原来的转拨后的号码,没有的显示空
开始时间1 显示原先记录中拨10190的时间
开始时间显示原先转拨后的开始时间或者直播的开始时间
...全文
189 点赞 收藏 10
写回复
10 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
godhuang 2005-07-22
就是啊,艾!痛苦中,不知道有没有什么再好点的方法
回复
LSL_winnie 2005-07-22
你是干sp的吧!
回复
phantomMan 2005-07-22
如果你是查询少量数据,可以使用索引来提高速度,比如你对 主叫,结束时间等建立索引,可以提高查询速度;
但是如果你要把80万条记录一起查询,索引也没有办法
回复
phantomMan 2005-07-22
上面的试了吗?要多久时间?
回复
godhuang 2005-07-22
一般语句是可以实现,主要是用什么方法提高速度
回复
phantomMan 2005-07-22
下面不是通用,这里假设 你的手机被叫号码 10190 会比任何其他真实号码小,例如不会有1001214553 的这种手机号码存在;

declare @t table(id int identity(1,1),callernum varchar(20),callednum varchar(20),stime datetime,etime datetime)
insert @t select '13777837123','10190','2005-6-16 1:55','2005-6-16 1:55'
insert @t select '13777837123','2886612409','2005-6-16 1:55','2005-6-16 1:55'
insert @t select '13777837123','10190','2005-6-20 18:28','2005-6-20 18:28'
insert @t select '13777837123','13208118826','2005-7-4 10:19','2005-7-4 10:19'

select t1.id,
t1.callernum,
case when t2.mincallednum='10190' then '10190' else '' end as '被叫1',
case when t1.callednum<>'10190' then t1.callednum else '' end as '被叫',
t1.stime,
t1.etime
from @t t1,(
select callernum,etime,min(callednum) mincallednum,
max(callednum) callednum from @t
group by callernum,etime
)t2
where t1.callernum=t2.callernum and t1.etime=t2.etime and t1.callednum=t2.callednum
order by t1.id

回复
godhuang 2005-07-22
select a.callernum as callernum,
callernum1 = case a.callednum when '10190' then a.callednum else '' end,
callednum = isnull(b.callednum,''),
a.stime,a.etime
from @t a left join @t b on (a.callernum = b.callernum and a.etime = b.etime and b.callednum <> '10190')
where not exists(select 1 from @t where callednum < a.callednum and etime = a.etime)
order by a.etime,a.callednum

这个是我自己写的,速度比较慢,所以问大家有没有什么好方法

对80万的数据都要30秒以上,而且数据还在增加
回复
godhuang 2005-07-22
declare @t table(callernum varchar(20),callednum varchar(20),stime datetime,etime datetime)
insert @t select '13777837123','10190','2005-6-16 1:55','2005-6-16 1:55'
insert @t select '13777837123','2886612409','2005-6-16 1:55','2005-6-16 1:55'
insert @t select '13777837123','10190','2005-6-20 18:28','2005-6-20 18:28'
insert @t select '13777837123','13208118826','2005-7-4 10:19','2005-7-4 10:19'

13777837123 101902 2005-7-4 9:50 2005-7-4 9:51
13777837123 101902 2005-7-4 9:53 2005-7-4 9:53
13777837123 101902 2005-7-4 9:56 2005-7-4 9:56
13777837123 13086611121 2005-7-4 9:56 2005-7-4 9:56
13777837123 101902 2005-7-4 9:57 2005-7-4 9:57
13777837123 13086611121 2005-7-4 9:57 2005-7-4 9:57
13777837123 101902 2005-7-4 10:12 2005-7-4 10:12
13777837123 13208118826 2005-7-4 10:19 2005-7-4 10:19:01
13777837123 13208118826 2005-7-4 10:19 2005-7-4 10:19:02
13777837123 13208118826 2005-7-4 10:19 2005-7-4 10:19:03
13777837123 13208118826 2005-7-4 10:19 2005-7-4 10:19:10
13777837123 13208118826 2005-7-4 10:19 2005-7-4 10:19:11
13777837123 13208118826 2005-7-4 10:20 2005-7-4 10:20:12
13777837123 13208118826 2005-7-4 10:20 2005-7-4 10:20:13
13777837123 13208118826 2005-7-4 10:20 2005-7-4 10:20:15
13777837123 13208118826 2005-7-4 10:20 2005-7-4 10:20:20
13777837123 13208118826 2005-7-4 10:20 2005-7-4 10:20:35
13777837123 13208118826 2005-7-4 10:20 2005-7-4 10:20:45
13777837123 101902 2005-7-4 10:16 2005-7-4 10:20
13777837123 101902 2005-7-4 10:21 2005-7-4 10:21

数据量比较大,都是百万级数据,谢谢

回复
phantomMan 2005-07-22
80万条数据,你直接查询时间都比较久

我试过,只有5个字段,要7--13秒左右
回复
godhuang 2005-07-22
phantomMan 速度比我写的好多了,不过你说的那个可能居然存在,所以game over
回复
相关推荐
发帖
应用实例
创建于2007-09-28

2.7w+

社区成员

MS-SQL Server 应用实例
申请成为版主
帖子事件
创建了帖子
2005-07-22 08:51
社区公告
暂无公告