更新问题

99归一 2012-11-13 02:34:49

create table #temp_a(
member_id INT,
member_name VARCHAR,
member_type varchar,
date smalldatetime,
date_insert smalldatetime
)

create table #temp_b(
member_id INT,
member_name VARCHAR,
member_type varchar,
date smalldatetime
)
--原来两张表都为空的,然后开始十一号想#temp_b中插入数据
select 1,'客户a','成长期','2012-11-11 00:00:00'
union all
select 2,'客户b','成熟期','2012-11-11 00:00:00'
union all
select 3,'客户c','开发期','2012-11-11 00:00:00'
union all
select 4,'客户d','拓展期','2012-11-11 00:00:00'
--而#tesp_a中数据是从#temp_b中取来的
--所以#temp_a中数据为
1,'客户a','成长期','2012-11-11 00:00:00','2012-11-11 00:00:00'
2,'客户b','成熟期','2012-11-11 00:00:00','2012-11-11 00:00:00'
3,'客户c','开发期','2012-11-11 00:00:00','2012-11-11 00:00:00'
4,'客户d','拓展期','2012-11-11 00:00:00','2012-11-11 00:00:00'
--#temp_b中数据是每天都truncate table 后重新插入

--十二号时,先truncate table #temp_b中数据 ,再重新插入
insert into #temp_b
select 1,'客户a','成熟期','2012-11-12 00:00:00'
union all
select 2,'客户b','开发期','2012-11-12 00:00:00'
union all
select 3,'客户c','挽留期','2012-11-12 00:00:00'
union all
select 4,'客户d','拓展期','2012-11-12 00:00:00'

--而十二号时#temp_a中数据,之前的数据保留为:
--再插入由#temp_b中新的数据,但member_type不同的时候date这列不变,member_type相同的时候把新插入的数据,date这列更新为最近的时间
--,所以十二号的数据为
1,'客户a','成长期','2012-11-11 00:00:00','2012-11-11 00:00:00'
2,'客户b','成熟期','2012-11-11 00:00:00','2012-11-11 00:00:00'
3,'客户c','开发期','2012-11-11 00:00:00','2012-11-11 00:00:00'
4,'客户d','拓展期','2012-11-11 00:00:00','2012-11-11 00:00:00'

1,'客户a','成熟期','2012-11-12 00:00:00','2012-12-12 00:00:00'
2,'客户b','开发期','2012-11-12 00:00:00','2012-12-12 00:00:00'
3,'客户c','挽留期','2012-11-12 00:00:00','2012-12-12 00:00:00'
4,'客户d','拓展期','2012-11-11 00:00:00','2012-12-12 00:00:00'

--以此类推
--十三号#temp_b中数据为:
insert into #temp_b
select 1,'客户a','挽留期','2012-13-13 00:00:00'
union all
select 2,'客户b','拓展期','2012-11-13 00:00:00'
union all
select 3,'客户c','挽留期','2012-11-13 00:00:00'
union all
select 4,'客户d','拓展期','2012-11-13 00:00:00'
--#temp_a中数据为:
1,'客户a','成长期','2012-11-11 00:00:00','2012-11-11 00:00:00'
2,'客户b','成熟期','2012-11-11 00:00:00','2012-11-11 00:00:00'
3,'客户c','开发期','2012-11-11 00:00:00','2012-11-11 00:00:00'
4,'客户d','拓展期','2012-11-11 00:00:00','2012-11-11 00:00:00'

1,'客户a','成熟期','2012-11-12 00:00:00','2012-12-12 00:00:00'
2,'客户b','开发期','2012-11-12 00:00:00','2012-12-12 00:00:00'
3,'客户c','挽留期','2012-11-12 00:00:00','2012-12-12 00:00:00'
4,'客户d','拓展期','2012-11-11 00:00:00','2012-12-12 00:00:00'

1,'客户a','挽留期','2012-11-13 00:00:00','2012-12-13 00:00:00'
2,'客户b','拓展期','2012-11-13 00:00:00','2012-12-13 00:00:00'
3,'客户c','挽留期','2012-11-12 00:00:00','2012-12-13 00:00:00'
4,'客户d','拓展期','2012-11-11 00:00:00','2012-12-13 00:00:00'

--十四号#temp_b中数据为:
insert into #temp_b
select 1,'客户a','挽留期','2012-13-14 00:00:00'
union all
select 2,'客户b','开发期', '2012-11-14 00:00:00'
union all
select 3,'客户c','挽留期','2012-11-14 00:00:00'
union all
select 4,'客户d','拓展期','2012-11-14 00:00:00'
--#temp_a中数据为:
1,'客户a','成长期','2012-11-11 00:00:00','2012-11-11 00:00:00'
2,'客户b','成熟期','2012-11-11 00:00:00','2012-11-11 00:00:00'
3,'客户c','开发期','2012-11-11 00:00:00','2012-11-11 00:00:00'
4,'客户d','拓展期','2012-11-11 00:00:00','2012-11-11 00:00:00'

1,'客户a','成熟期','2012-11-12 00:00:00','2012-12-12 00:00:00'
2,'客户b','开发期','2012-11-12 00:00:00','2012-12-12 00:00:00'
3,'客户c','挽留期','2012-11-12 00:00:00','2012-12-12 00:00:00'
4,'客户d','拓展期','2012-11-11 00:00:00','2012-12-12 00:00:00'

1,'客户a','挽留期','2012-11-13 00:00:00','2012-12-13 00:00:00'
2,'客户b','拓展期','2012-11-13 00:00:00','2012-12-13 00:00:00'
3,'客户c','挽留期','2012-11-12 00:00:00','2012-12-13 00:00:00'
4,'客户d','拓展期','2012-11-11 00:00:00','2012-12-13 00:00:00'

1,'客户a','挽留期','2012-11-13 00:00:00','2012-12-14 00:00:00'
2,'客户b','开发期','2012-11-14 00:00:00','2012-12-14 00:00:00'
3,'客户c','挽留期','2012-11-12 00:00:00','2012-12-14 00:00:00'
4,'客户d','拓展期','2012-11-11 00:00:00','2012-12-14 00:00:00'
--在真实环境中数据一天的数据将近110w之多,要求的只保留四天的数据,所以希望效率高点的算法
...全文
274 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
niss 2012-11-14
  • 打赏
  • 举报
回复
引用 12 楼 tongtong_qing 的回复:
问题已经解决了,我使用的通过UPdate的方法,先将最新的数据插入,再与最近的一段时间进行比较,然后进行更新,我在真实数据库中测试过了,速度有点慢,所以执行的得放在晚上,服务器压力相对小点
使用intersect或except,你的情况是我处理过的一个分支,双时间戳实现历史数据切片,呵呵,蛮节省存储空间
99归一 2012-11-13
  • 打赏
  • 举报
回复
问题已经解决了,我使用的通过UPdate的方法,先将最新的数据插入,再与最近的一段时间进行比较,然后进行更新,我在真实数据库中测试过了,速度有点慢,所以执行的得放在晚上,服务器压力相对小点
qvbyaolin 2012-11-13
  • 打赏
  • 举报
回复
引用 10 楼 DBA_Huangzj 的回复:
大概: insert into xxx select xxx from tb a where exists (select 1 from #tb b where a.主键=b.主键 and datediff(dd,a.日起列,dateadd(dd,b.日期列,-1))=1)
这个筛选出了已存重复记录,然后Union 当天剩余记录,播入到A表就可以了.
發糞塗牆 2012-11-13
  • 打赏
  • 举报
回复
大概: insert into xxx select xxx from tb a where exists (select 1 from #tb b where a.主键=b.主键 and datediff(dd,a.日起列,dateadd(dd,b.日期列,-1))=1)
99归一 2012-11-13
  • 打赏
  • 举报
回复
是不是我说的不清楚呀!
zyg0 2012-11-13
  • 打赏
  • 举报
回复
神马情况 怎么看不明白
99归一 2012-11-13
  • 打赏
  • 举报
回复
引用 6 楼 DBA_Huangzj 的回复:
用max来获取最接近插入数据当前的数据,这样就算有10天数据也只会取最近一天的了
但是我要更新的,与最近的一天的前一天进行比对的,这条UPdate算法怎么么写呢?
發糞塗牆 2012-11-13
  • 打赏
  • 举报
回复
用max来获取最接近插入数据当前的数据,这样就算有10天数据也只会取最近一天的了
99归一 2012-11-13
  • 打赏
  • 举报
回复
说白了,就是,将#temp_b中的数据插入到#temp_a中,如果第二天的type相同,则date这列就为第一天的时间,如果不相同,也就为第二天的时间,也就和和date_insert相同,其实如果单纯两天的数据的话,很简单,可以更新了,但难点就在,#temp_a中保留了四天的数据,比对起来就麻烦了
發糞塗牆 2012-11-13
  • 打赏
  • 举报
回复
没看懂,不过给出这些代码对后面处理问题有帮助。
xb12369 2012-11-13
  • 打赏
  • 举报
回复
99归一 2012-11-13
  • 打赏
  • 举报
回复
引用 1 楼 TravyLee 的回复:
好久不见了
万恶的会员信息发掘,搞死了
  • 打赏
  • 举报
回复
好久不见了

34,838

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧