这是最好的时代,这是最坏的时代,这是智慧的时代,这是愚蠢的时代;这是信仰的时期,这是怀疑的时期;这是光明的季节,这是黑暗的季节;这是希望之春,这是失望之冬;人们面前有着各样事物,人们面前一无所有;人们正在直登天堂;人们正在直下地狱。
我也要与时俱进了,被itpub2.0牵着尾巴,拼命的奔跑,不停的灌水...
关于数据事实表汇总的模拟实现——脚本实现
上一篇 / 下一篇 2008-02-14 22:07:25 / 个人分类:数据仓库专区
本文主要是针对数据仓库中的事实表汇总或者聚集进行模拟实现的
实现的环境:
数据仓库数据库:SQLServer2000
ITPUB个人空间J qeqjSP创建表脚本
| CREATE TABLE t_fact_RunStatus V-qVX(b0n0( /]&e)U7f{DUy0factProcName VARCHAR(40), ;Qc V_7T vbAc3u0factDesc VARCHAR(100), %a'RKn)b7U7PZ\0factType INT,ITPUB个人空间BP!XG O.I LastLogTime DATETIME,ITPUB个人空间 ~1v O1b;d(xQ T-A"I BeginTime DATETIME, %rB9EN}w/o0EndTime DATETIME, +F+XTz\ C4DH0Status VARCHAR(20),ITPUB个人空间`}*c2WYM.Fn LogLimit INT,ITPUB个人空间.wgcf c m,s_n9e7m Step INT,ITPUB个人空间'r;R:JP@.~ CancelFlag INT,ITPUB个人空间0L6W"v2X }hb\ CurTime DATETIME ~j0[e:W|el U0)ITPUB个人空间pD&M!mjd$U GO oo+f?{.j0ITPUB个人空间"G?4TZu&e/fo CREATE TABLE t_org_table 1Q.yEl4i]$m0(ITPUB个人空间r3U7z4Z` W!q(W LogDate DATETIME,ITPUB个人空间3@|%o&aXoc%F C Dim1 INT,ITPUB个人空间$TO*OTmf Dim2 INT,ITPUB个人空间0m)f:\a(oIu:[Z Value1 NUMERIC(10,0), ~A7e?:|^wX.Z0Value2 NUMERIC(10,0) -~j[`RoT}7eq0) bI0kM6_~0GOITPUB个人空间MO'U.TzL)m UE#B K/`,Rqi0CREATE TABLE t_fact_table "CF#T ZIDvA0( MBibE M1iS}0LogDate DATETIME,ITPUB个人空间1M:B#`r ]2HXU Dim1 INT, }^DF(t3@0Dim2 INT,ITPUB个人空间)@Y5M2E C3p'R*f Measure1 NUMERIC(10,0), nZ%m3u9XQi0Measure2 NUMERIC(10,0)ITPUB个人空间~fJB7n7W%C ) r5Wm6y\$F0GO |
| CREATE PROCEDURE p_fact_xxxITPUB个人空间
`wz(aI ASITPUB个人空间.atW2q"?2]T DECLARE @step INTEGER --获取本次处理距离当前最大时间间隔 X0CS7d#p U0DECLARE @LogLimit INTEGER --获取本次处理最大时间间隔 Y u+ct L cg0DECLARE @BeginTime DATETIME --获取本次处理开始时间ITPUB个人空间?)av0pB p DECLARE @EndTime DATETIME --获取本次处理结束时间ITPUB个人空间 |2Cg4?w8g5E2s0I+SwD n DECLARE @Num INTEGER --获取是否存在此次任务ITPUB个人空间(ZXq] {0A%U DECLARE @TimeTemp VARCHAR(20) --时间临时中间变量 UZ%D4DlrzK0DECLARE @StatSecTime INTEGER --每次处理的步增情况,默认为1,即1小时ITPUB个人空间dz yzi DECLARE @LastLogTime DATETIME --每次处理的当前时间点 0X:h,_Ai3Yv0DECLARE @Status VARCHAR(20) --本次处理的状态,EXCEPTION和FINISHED两种情况 S7E&~ MN#]0DECLARE @CancelFlag INTEGER --取消情况,1和0ITPUB个人空间nv"e2iBl8D6S%A+tZ BEGIN 7T:a4h`)Q0M|'j P!t0ITPUB个人空间8l?\^M'~Q SELECT @StatSecTime = 1 9uN vh ^'\+^\"S0ITPUB个人空间7F$@.vx9c;z --获取上次处理的最后时间,状态和取消情况ITPUB个人空间,x0A|PSO SELECT @LastLogTime = LastLogTime,@Status = Status,@CancelFlag = CancelFlag Ao kBH0FROM t_fact_RunStatus KViZzb6xle0WHERE UPPER(factProcName) = UPPER('p_fact_table')ITPUB个人空间?U`-nQ/H0iN n ITPUB个人空间&Vd+W8lv{ --假如为取消该任务,则直接退出 r_'_'n3gqU7n0IF @CancelFlag = 1 OR @CancelFlag IS NULLITPUB个人空间b ePI3}X-x RETURNITPUB个人空间N'd*zD5C/],M2H:|9s`p ITPUB个人空间s4\O1~&I#T l --判断是否存在此次任务 q L;W'Gg+f0SELECT @Num = COUNT(factProcName) FROM t_fact_RunStatusITPUB个人空间k;X1k g:HM WHERE UPPER(factProcName) = UPPER('p_fact_table')ITPUB个人空间u)F4WVq K}wad)i7\a)P0--存在更新任务状态,没有则新增一个任务ITPUB个人空间D8JBu1E^ IF @Num = 1 W7s7|+p*z3R)A _Y"g0UPDATE t_fact_RunStatus set Status = 'RUNNING',CurTime=GETDATE() 9kn*P ]5v A2zh0WHERE UPPER(factProcName) = UPPER('p_fact_table')ITPUB个人空间.Q M:Y{9V ELSE @P:pzZh S0BEGINITPUB个人空间u']-RQS:v*|i^ IF @Num > 1 CbY5t+E5`H0DELETE FROM t_fact_RunStatus 3F DG]!\5p0WHERE UPPER(factProcName) = UPPER('p_fact_table')ITPUB个人空间.?3[)b9H ~V INSERT INTO t_fact_RunStatus(factProcName, factDesc, factType,Status, LogLimit, Step, CancelFlag,CurTime) 4\[LgQ*k!v0VALUES(UPPER('p_fact_table'), 'XXXXXX', 60,'RUNNING', 24, 120, 0,GETDATE()) .H$PBz8fxoi&O0ENDITPUB个人空间!]"x/ECuS"n E+~LOu4K,LH0--获取本次任务开始的开始时间和结束时间 pX|;j2H-Z(_(KG0BEGIN ]D8_b,[8W0ITPUB个人空间Jj~6au`,a*b --如果任务没有正常终结,则从事实表中获取 %idw.yG D\0--否则获取通过配置表获取,不过此处存在一定风险,既没有考虑到事实上的时间盲点ITPUB个人空间'Y'Dy|3|'XV)O IF @Status != 'FINISHED' ,xw } PM2W ?3U#d0SELECT @BeginTime = DATEADD(hh,@StatSecTime,max(LogDate)) FROM t_fact_table zY8YBsrkl0ELSE +Up6W+N[ e N5s*K0SELECT @BeginTime = DATEADD(hh,@StatSecTime,@LastLogTime) 6V'N)C~U/O4p5h2Qj0 %g*pv)J:h q;}d0IF @BeginTime IS NULLITPUB个人空间"`\_ FzN#_7Tn SELECT @BeginTime = MIN(LogDate) FROM t_org_table |