数据库背景请看这里
http://topic.csdn.net/u/20081019/16/cdb4718f-315e-427c-867d-39082b6ab6da.html现在决定采用逐日递增的方法从日表生成周表,这里求一个语句
假设ds_day为日表,ds_week为周表,ds_month为月表
更新本周包括两部分:--更新已存在的手机号的访问次数
update ds_week set
cnt = a.cnt + b.cnt
from ds_day a
join ds_week b on a.number=b.number and weekid(a.day)=b.weekid
--插入第一次出现的手机号及访问次数
insert into ds_week
select weekid(a.day), number, cnt
from ds_day a
where day = @theday
and not exists (select 1 from ds_week b --有什么语句可以替代这里的exists么?以前看资料说iq的exists效率不是很高
where b.number=a.number and b.weekid=weekid(a.day))月表从周表统计,逻辑如下:
(1) 先获得本月中出现的周ID select weekid from 时间纬度表 where year=@thisyear and month=@thismonth
(2)然后insert into ds_month select @thisyear,@thismonth,number,sum(cnt) from ds_week where weekid in (上面(1)的查询结果)
(3) 然后再减去(1)查询里面的第一周不在本月的前几天的数据就可以这里的(3)用一个update我会写,但是有没有一个sql在可以把(2)(3)写成一个语句一次就insert完成的?
http://topic.csdn.net/u/20081019/16/cdb4718f-315e-427c-867d-39082b6ab6da.html现在决定采用逐日递增的方法从日表生成周表,这里求一个语句
假设ds_day为日表,ds_week为周表,ds_month为月表
更新本周包括两部分:--更新已存在的手机号的访问次数
update ds_week set
cnt = a.cnt + b.cnt
from ds_day a
join ds_week b on a.number=b.number and weekid(a.day)=b.weekid
--插入第一次出现的手机号及访问次数
insert into ds_week
select weekid(a.day), number, cnt
from ds_day a
where day = @theday
and not exists (select 1 from ds_week b --有什么语句可以替代这里的exists么?以前看资料说iq的exists效率不是很高
where b.number=a.number and b.weekid=weekid(a.day))月表从周表统计,逻辑如下:
(1) 先获得本月中出现的周ID select weekid from 时间纬度表 where year=@thisyear and month=@thismonth
(2)然后insert into ds_month select @thisyear,@thismonth,number,sum(cnt) from ds_week where weekid in (上面(1)的查询结果)
(3) 然后再减去(1)查询里面的第一周不在本月的前几天的数据就可以这里的(3)用一个update我会写,但是有没有一个sql在可以把(2)(3)写成一个语句一次就insert完成的?
在MS SQLServer中exists的效率还是很高的。你可以查看一下计划任务关于月表的另一种方式:每日更新
从日表中取出最后一天的数据(做好索引的话,效率应该能够满足你的要求)
参考周报的方法更新月表的当月数据
insert into ds_month select @thisyear,@thismonth,number,sum(cnt)-(1查询里面的第一周不在本月的前几天的数据)from ds_week where weekid in (上面(1)的查询结果)
insert into ds_month select @thisyear,@thismonth,number,sum(cnt)-(1查询里面的第一周不在本月的前几天的数据)from ds_week where weekid in (上面(1)的查询结果)