关于数据事实表汇总的模拟实现——脚本实现

本文主要是针对数据仓库中的事实表汇总或者聚集进行模拟实现的

实现的环境:

数据仓库数据库:SQLServer2000


创建表脚本
CREATE TABLE t_fact_RunStatus
(
factProcName VARCHAR(40),
factDesc VARCHAR(100),
factType INT,
LastLogTime DATETIME,
BeginTime DATETIME,
EndTime DATETIME,
Status VARCHAR(20),
LogLimit INT,
Step INT,
CancelFlag INT,
CurTime DATETIME
)
GO

CREATE TABLE t_org_table
(
LogDate DATETIME,
Dim1 INT,
Dim2 INT,
Value1 NUMERIC(10,0),
Value2 NUMERIC(10,0)
)
GO

CREATE TABLE t_fact_table
(
LogDate DATETIME,
Dim1 INT,
Dim2 INT,
Measure1 NUMERIC(10,0),
Measure2 NUMERIC(10,0)
)
GO
创建存储过程脚本
CREATE PROCEDURE p_fact_xxx
AS
DECLARE @step INTEGER --获取本次处理距离当前最大时间间隔
DECLARE @LogLimit INTEGER --获取本次处理最大时间间隔
DECLARE @BeginTime DATETIME --获取本次处理开始时间
DECLARE @EndTime DATETIME --获取本次处理结束时间
DECLARE @Num INTEGER --获取是否存在此次任务
DECLARE @TimeTemp VARCHAR(20) --时间临时中间变量
DECLARE @StatSecTime INTEGER --每次处理的步增情况,默认为1,即1小时
DECLARE @LastLogTime DATETIME --每次处理的当前时间点
DECLARE @Status VARCHAR(20) --本次处理的状态,EXCEPTION和FINISHED两种情况
DECLARE @CancelFlag INTEGER --取消情况,1和0
BEGIN

SELECT @StatSecTime = 1

--获取上次处理的最后时间,状态和取消情况
SELECT @LastLogTime = LastLogTime,@Status = Status,@CancelFlag = CancelFlag
FROM t_fact_RunStatus
WHERE UPPER(factProcName) = UPPER('p_fact_table')

--假如为取消该任务,则直接退出
IF @CancelFlag = 1 OR @CancelFlag IS NULL
RETURN

--判断是否存在此次任务
SELECT @Num = COUNT(factProcName) FROM t_fact_RunStatus
WHERE UPPER(factProcName) = UPPER('p_fact_table')

--存在更新任务状态,没有则新增一个任务
IF @Num = 1
UPDATE t_fact_RunStatus set Status = 'RUNNING',CurTime=GETDATE()
WHERE UPPER(factProcName) = UPPER('p_fact_table')
ELSE
BEGIN
IF @Num > 1
DELETE FROM t_fact_RunStatus
WHERE UPPER(factProcName) = UPPER('p_fact_table')
INSERT INTO t_fact_RunStatus(factProcName, factDesc, factType,Status, LogLimit, Step, CancelFlag,CurTime)
VALUES(UPPER('p_fact_table'), 'XXXXXX', 60,'RUNNING', 24, 120, 0,GETDATE())
END

--获取本次任务开始的开始时间和结束时间
BEGIN

--如果任务没有正常终结,则从事实表中获取
--否则获取通过配置表获取,不过此处存在一定风险,既没有考虑到事实上的时间盲点
IF @Status != 'FINISHED'
SELECT @BeginTime = DATEADD(hh,@StatSecTime,max(LogDate)) FROM t_fact_table
ELSE
SELECT @BeginTime = DATEADD(hh,@StatSecTime,@LastLogTime)

IF @BeginTime IS NULL
SELECT @BeginTime = MIN(LogDate) FROM t_org_table

IF @BeginTime IS NULL
BEGIN
UPDATE t_fact_RunStatus SET Status = 'EXCEPTION'
WHERE UPPER(factProcName) = UPPER('p_fact_table')
RETURN
END

--时间取整,此处为整点小时
SELECT @TimeTemp = CONVERT(VARCHAR, @BeginTime,112)
SELECT @TimeTemp = @TimeTemp + ' ' + DATENAME(hour, @BeginTime)
SELECT @TimeTemp = @TimeTemp + ':' + '00:00'
SELECT @BeginTime = CONVERT(DATETIME, @TimeTemp)

--获取距离当前时间最大间隔和当前处理的最大间隔
SELECT @Step = ISNULL(Step, 120),@LogLimit = ISNULL(LogLimit, 24)
FROM t_fact_RunStatus
WHERE UPPER(factProcName) = UPPER('p_fact_table')

SELECT @EndTime = DATEADD(minute, -@step, getdate())

--如果要处理的时间间隔大于指定间隔,则从原始记录表中获取开始时间和结束时间
--否则直接对结束时间进行截取
IF DATEDIFF(hour, @BeginTime, @EndTime) > @LogLimit
BEGIN
SELECT @BeginTime = MIN(LogDate) FROM t_org_table WHERE LogDate >= @BeginTime
SELECT @TimeTemp = CONVERT(VARCHAR, @BeginTime,112)
SELECT @TimeTemp = @TimeTemp + ' ' + DATENAME(hour, @BeginTime)
SELECT @TimeTemp = @TimeTemp + ':' + '00:00'
SELECT @BeginTime = CONVERT(DATETIME, @TimeTemp)
SELECT @EndTime = DATEADD(HOUR, @LogLimit, @BeginTime)
END
ELSE
BEGIN
SELECT @TimeTemp = CONVERT(VARCHAR, @EndTime,112)
SELECT @TimeTemp = @TimeTemp + ' ' + DATENAME(hour, @EndTime)
SELECT @TimeTemp = @TimeTemp + ':' + '00:00'
SELECT @EndTime = CONVERT(DATETIME, @TimeTemp)
END

END

--更新开始和结束时间
UPDATE t_fact_RunStatus
SET BeginTime = @BeginTime,
EndTime = @EndTime
WHERE UPPER(factProcName) = UPPER('p_fact_table')

--为了减少系统压力,循环进行数据处理
WHILE @BeginTime < @EndTime
BEGIN
BEGIN TRAN Tran_Fact

INSERT INTO t_fact_table
(
LogDate,
Dim1 ,
Dim2 ,
Measure1 ,
Measure2
)
SELECT
@BeginTime,
Dim1,
Dim2,
SUM(Value1),
SUM(Value2)
FROM t_org_table a
WHERE LogDate >= @BeginTime
AND LogDate < DATEADD(hour,@StatSecTime, @BeginTime)
GROUP BY Dim1,Dim2

IF @@ERROR <> 0
GOTO FAIL

--每次处理完,必须更新当前的时间标志
UPDATE t_fact_RunStatus
SET LastLogTime=@BeginTime,
CurTime = GETDATE(),
Status = 'FINISHED'
WHERE UPPER(factProcName) = UPPER('p_fact_table')

COMMIT TRAN Tran_Fact

SELECT @BeginTime = DATEADD(hour, @StatSecTime, @BeginTime)

END

RETURN

FAIL:

ROLLBACK TRAN Tran_Fact

UPDATE t_fact_RunStatus
SET Status = 'EXCEPTION',
LastLogTime=@BeginTime
WHERE UPPER(factProcName) = UPPER('p_fact_table')

RETURN 0

END
创建模拟数据脚本
--创建测试数据
DECLARE @i INT
SELECT @i = 1
WHILE @i<=365
BEGIN
INSERT INTO t_org_table(LogDate,Dim1,Dim2,Value1,Value2)
VALUES(DATEADD(hour,24*(@i-1),CONVERT(DATETIME,'2006-01-01')),@i,@i,@i,@i);
INSERT INTO t_org_table(LogDate,Dim1,Dim2,Value1,Value2)
VALUES(DATEADD(hour,24*(@i-1),CONVERT(DATETIME,'2006-01-01 12:00:00')),@i,@i,@i,@i);
SELECT @i = @i+1
END
调用脚本
EXEC p_fact_xxx
SELECT * FROM dbo.t_fact_RunStatus
SELECT * FROM dbo.t_fact_table

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/6517/viewspace-145460/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/6517/viewspace-145460/

本教程为授权出品 一、课程简介数据仓库(Data Warehouse,可简写为DW或DWH),是面向分析的集成化数据环境,为企业决策制定过程,提供系统数据支持的战略集合,是国内外各大公司正在重点投入的战略级技术领域。 二、课程内容《大数据电商数仓项目实战》视频教程,从项目架构的搭建,到数据采集模块的设计、数仓架构的设计、实战需求实现、即席查询的实现,我们针对国内目前广泛使用的Apache原生框架和CDH版本框架进行了分别介绍,Apache原生框架介绍中涉及到的技术框架包括Flume、Kafka、Sqoop、MySql、HDFS、Hive、Tez、Spark、Presto、Druid等,CDH版本框架讲解包括CM的安装部署、Hadoop、Zookeeper、Hive、Flume、Kafka、Oozie、Impala、HUE、Kudu、Spark的安装配置,透彻了解不同版本框架的区别联系,将大数据全生态系统前沿技术一网打尽。在过程中对大数据生态体系进行了系统的讲解,对实际企业数仓项目中可能涉及到的技术点都进行了深入的讲解和探讨。同时穿插了大量数仓基础理论知识,让你在掌握实战经验的同时能够打下坚实的理论基础。 三、课程目标本课程以国内电商巨头实际业务应用场景为依托,对电商数仓的常见实战指标以及难点实战指标进行了详尽讲解,具体指标包括:每日、周、月活跃设备明细,留存用户比例,沉默用户、回流用户、流失用户统计,最近连续3周活跃用户统计,最近7天内连续3天活跃用户统计,GMV成交总额分析,转化率及漏斗分析,品牌复购率分析、订单表拉链表的设计等,让学生拥有更直观全面的实战经验。通过对本课程的学习,对数仓项目可以建立起清晰明确的概念,系统全面的掌握各项数仓项目技术,轻松应对各种数仓难题。 四、课程亮点本课程结合国内多家企业实际项目经验,特别加入了项目架构模块,从集群规模的确定到框架版本选型以及服务器选型,手把手教你从零开始搭建大数据集群。并且总结大量项目实战中会遇到的问题,针对各个技术框架,均有调优实战经验,具体包括:常用Linux运维命令、Hadoop集群调优、Flume组件选型及性能优化、Kafka集群规模确认及关键参数调优。通过这部分学习,助学生迅速成长,获取前沿技术经验,从容解决实战问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值