本文主要是介绍SQL回炉系列(三) 拆分原始数据到对应的月份表中,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
存放原始数据的表,需要定期把历史数据迁移并固定保存下来,否则原始数据表越来越大,不利于数据的频繁插入和查询。
下面的SQL语句是一个存储过程,每日0点执行,把前一天或前几天的数据迁移到对应的月份表中。
USE [PRODMS]
GOSET ANSI_NULLS ON
GOSET QUOTED_IDENTIFIER ON
GOALTER proc [dbo].[SplitOriginalValue]
AS
BEGINDECLARE @day int,@month int,@year intDECLARE @tbname varchar(35),@sql NVarchar(4000),@parmas Nvarchar(2000) SELECT @day= datepart (dd,min(getTime)) ,@month=datepart(mm,min(getTime)),@year=datepart(YEAR,min(getTime)) from CF_OriginalData IF(@month<10)SET @tbname='CF_OriginalData_'+Convert(varchar(4),@year)+'_0'+Convert(varchar(2),@month)ELSESET @tbname='CF_OriginalData_'+Convert(varchar(4),@year)+'_'+Convert(varchar(2),@month)--如果不存在该月份的表名需要新建一个该月份的表IF not exists(select * from sysobjects where name=@tbname) BEGINset @sql='create Table '+@tbname+'(AutoId int identity (1,1) primary key,UA decimal(10,2), UB decimal(10,2), UC decimal(10,2), IA decimal(10,2), IB decimal(10,2), IC decimal(10,2), py decimal(10,2), Qw decimal(10,2), pf decimal(10,2), EP decimal(12,2), back varchar(5), F decimal(10,2), getTime dateTime, Number Nvarchar(20) )' execute ( @sql) ENDIF @day<DATEPART(dd,getdate()) and @month=DATEPART(mm,getdate()) -- 判断OriginalData中最早的数据是否小于今天且是同一个月的BEGIN -- 插入数据到月份表中SET @sql=' insert into ' +@tbname+' (UA, UB, UC, IA, IB, IC, py, Qw, pf, EP, back, F, getTime, Number )select UA, UB, UC, IA, IB, IC, py, Qw, pf, EP, back, F, getTime, Number from CF_OriginalData where Convert(varchar(10),getTime,120)<= Convert(varchar(10),dateAdd(dd,-1,getdate()),120)' execute ( @sql) -- 删除OriginalData中的数据DELETE FROM CF_OriginalData where Convert(varchar(10),getTime,120)<= Convert(varchar(10),dateAdd(dd,-1,getdate()),120)ENDELSE -- 新的月份BEGIN SET @sql=' insert into ' +@tbname +' ( UA, UB, UC, IA, IB, IC, py, Qw, pf, EP, back, F, getTime, Number ) '+ ' select UA, UB, UC, IA, IB, IC, py, Qw, pf, EP, back, F, getTime, Number from CF_OriginalData where DATEPART(dd,getTime)= @days 'execute ( @sql) -- 删除OriginalData中的数据DELETE FROM CF_OriginalData WHERE DATEPART(dd,getTime)= @day and DATEPART(mm,getTime)= @month and DATEPART(yyyy,getTime)= @yearEND
END
- SQL回炉系列(一) 序言
- SQL回炉系列(二) 多表联合查询和排序
- SQL回炉系列(三) 拆分原始数据到对应的月份表中
- SQL回炉系列(四) 删除重复数据
- SQL回炉系列(五) 为显示曲线图获取不同时间颗粒的数据
这篇关于SQL回炉系列(三) 拆分原始数据到对应的月份表中的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!