数据库背景请看这里
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完成的?

解决方案 »

  1.   

    关于"-- 有什么语句可以替代这里的exists么?以前看资料说iq的exists效率不是很高"
    在MS SQLServer中exists的效率还是很高的。你可以查看一下计划任务关于月表的另一种方式:每日更新
    从日表中取出最后一天的数据(做好索引的话,效率应该能够满足你的要求)
    参考周报的方法更新月表的当月数据
      

  2.   


    insert into ds_month select @thisyear,@thismonth,number,sum(cnt)-(1查询里面的第一周不在本月的前几天的数据)from ds_week where weekid in (上面(1)的查询结果)
      

  3.   


    insert into ds_month select @thisyear,@thismonth,number,sum(cnt)-(1查询里面的第一周不在本月的前几天的数据)from ds_week where weekid in (上面(1)的查询结果)
      

  4.   

    insert into ds_month select @thisyear,@thismonth,number,sum(cnt)-(1查询里面的第一周不在本月的前几天的数据)from ds_week where weekid in (上面(1)的查询结果)