《BI项目笔记》创建时间维度(1)
SSAS Date 维度基本上在所有的 Cube 设计过程中都存在,很难见到没有时间维度的 OLAP 数据库。但是根据不同的项目需求, Date 维度的设计可能不大相同,所以在设计时间维度的时候需要搞清楚几个问题:
- 你的业务涉及到的最低的细节级别是什么?比如按季度查看报表还是按月份,或者按周,或者再甚者按天。这个细节级别需要弄清楚,比如在一些销售数据统计,有的时候可能更多按季度或者按月来查看报表。但在有的监控一些机器运行数据的统计,可能会按照小时或者分钟来查看报表。
- 你的报表所需要时间显示的格式是什么,比如在英文系统中客户是希望显示月份的全称 January 或者简称 Jan 或者只喜欢看到数字1,2,3 到12 这种类型。包括显示具体天的时候是希望看到 10/1/2005 还是 2005/10/01 等格式。
- 还有没有一些特别的时间信息比如不仅仅需要自然年,而且还需要财年信息,以及其它是否是闰年,周末等这样的要求。
- 最重要的一点是客户喜欢按照哪一种或者哪几种层次结构来查看报表,比如第一层是年,通过年导航到月再导航到日期;还是说通过年直接导航到周再到具体的日期。
弄清楚上面这几方面的内容之后,心里大概知道时间属性的范围了,细到哪一种级别,由哪些特别的字段需要添加都在这个设计阶段完成。
一般情况下,可以自己写一个创建时间日期的数据仓库维度表,在这个脚本里面可以根据需要自定义一些特别的日期格式。
GO
SET NOCOUNT ON IF OBJECT_ID('DimDate', 'U') IS NOT NULL
DROP TABLE DimDate
GO CREATE TABLE DimDate
(
DateKey INT PRIMARY KEY ,
FullDate DATE NOT NULL ,
[DateName] NVARCHAR(20) ,
DayNumberOfWeek TINYINT NOT NULL ,
DayNameOfWeek NVARCHAR(10) NOT NULL ,
DayNumberOfMonth TINYINT NOT NULL ,
DayNumberOfYear SMALLINT NOT NULL ,
IsWeekend BIT NOT NULL ,
IsLeapYear BIT NOT NULL ,
WeekNumberOfYear TINYINT NOT NULL ,
EnglishMonthName NVARCHAR(10) NOT NULL ,
MonthNumberOfYear TINYINT NOT NULL ,
CalendarQuarter TINYINT NOT NULL ,
CalendarSemester TINYINT NOT NULL ,
CalendarYear SMALLINT NOT NULL ,
FiscalQuarter TINYINT NOT NULL ,
FiscalSemester TINYINT NOT NULL ,
FiscalYear SMALLINT NOT NULL
) DECLARE @StartDate DATETIME
DECLARE @EndDate DATETIME SELECT @StartDate = '2005-01-01' ,
@EndDate = '2014-12-31' WHILE ( @StartDate <= @EndDate )
BEGIN
INSERT INTO DimDate
( DateKey ,
FullDate ,
[DateName] ,
DayNumberOfWeek ,
DayNameOfWeek ,
DayNumberOfMonth ,
DayNumberOfYear ,
IsWeekend ,
IsLeapYear ,
WeekNumberOfYear ,
EnglishMonthName ,
MonthNumberOfYear ,
CalendarQuarter ,
CalendarSemester ,
CalendarYear ,
FiscalQuarter ,
FiscalSemester ,
FiscalYear
)
SELECT CAST(CONVERT(VARCHAR(8), @StartDate, 112) AS INT) AS DateKey ,
CONVERT(VARCHAR(10), @StartDate, 20) AS FullDate ,
CONVERT(VARCHAR(20), @StartDate, 106) AS [DateName] ,
DATEPART(DW, @StartDate) AS DayNumberOfWeek ,
DATENAME(DW, @StartDate) AS DayNameOfWeek ,
DATENAME(DD, @StartDate) AS [DayOfMonth] ,
DATENAME(DY, @StartDate) AS [DayOfYear] ,
CASE WHEN DATEPART(DW, @StartDate) IN ( 1, 7 ) THEN 1
ELSE 0
END AS IsWeekend ,
CASE WHEN ( ( YEAR(@StartDate) % 4 = 0 )
AND ( YEAR(@StartDate) % 100 != 0
OR YEAR(@StartDate) % 400 = 0
)
) THEN 1
ELSE 0
END AS IsLeapYear ,
DATEPART(WW, @StartDate) AS WeekNumberOfYear ,
DATENAME(MM, @StartDate) AS EnglishMonthName ,
DATEPART(MM, @StartDate) AS MonthNumberOfYear ,
DATEPART(QQ, @StartDate) AS CalendarQuarter ,
CASE WHEN DATEPART(MM, @StartDate) BETWEEN 1 AND 6
THEN 1
ELSE 2
END AS CalendarSemester ,
DATEPART(YY, @StartDate) AS CalendarYear ,
CASE WHEN DATEPART(MM, @StartDate) BETWEEN 1 AND 6
THEN DATEPART(QQ, @StartDate) + 2
ELSE DATEPART(QQ, @StartDate) - 2
END AS FiscalQuarter ,
CASE WHEN DATEPART(MM, @StartDate) BETWEEN 1 AND 6
THEN 2
ELSE 1
END AS FiscalSemester ,
CASE WHEN DATEPART(MM, @StartDate) BETWEEN 1 AND 6
THEN DATEPART(YY, @StartDate)
ELSE DATEPART(YY, @StartDate) + 1
END AS FiscalYear SET @StartDate = @StartDate + 1
END
GO
---------------------------------------------------------------------
-- 加上视图的作用是因为在实际的项目开发中,SSAS 的数据源视图所有的表对象
-- 应该都引用视图,这样当数据仓库中维度表或者事实表有小的改动就可以直接在
-- 视图中修改,而可以避免修改 SSAS 项目。
-- 这一点在 SSIS 开发中同样适用,所有在 SSIS 中配置的 SQL 语句都封装在存储
-- 过程中,表封装在视图中。逻辑的修改直接体现在存储过程中,而不会修改 SSIS。
----------------------------------------------------------------------
IF OBJECT_ID('vDimDate', 'V') IS NOT NULL
DROP VIEW vDimDate
GO CREATE VIEW vDimDate
AS
-- 可以根据需要实现一些计算列,这些计算列通常也可以在 SSAS 视图中添加。
SELECT DateKey AS 'DateKey' ,
FullDate AS 'FullDate' ,
[DateName] AS 'DateName' ,
CONVERT(VARCHAR(2), DayNumberOfMonth) + ' ' + EnglishMonthName + ' '
+ CONVERT(CHAR(4), CalendarYear) AS 'FullDateName' , -- 1 July 2005
DayNumberOfWeek AS 'DayNumberOfWeek' ,
DayNameOfWeek AS 'DayNameOfWeek' ,
DayNumberOfMonth AS 'DayNumberOfMonth' ,
DayNumberOfYear AS 'DayNumberOfYear' ,
CASE WHEN IsWeekend = 1 THEN 'Weekend'
ELSE 'Weekday'
END AS 'WeekdayWeekend' ,
IsLeapYear AS 'IsLeapYear' ,
WeekNumberOfYear AS 'WeekNumberOfYear' ,
EnglishMonthName AS 'EnglishMonthName' ,
EnglishMonthName + ' ' + CONVERT(CHAR(4), CalendarYear) AS 'MonthName' , -- July 2005
CalendarYear * 100 + MonthNumberOfYear AS 'MonthKey' , --
MonthNumberOfYear AS 'MonthNumberOfYear' ,
CalendarQuarter AS 'CalendarQuarter' ,
CalendarSemester AS 'CalendarSemester' ,
CalendarYear AS 'CalendarYear' ,
CalendarYear * 100 + CalendarQuarter AS 'CalendarQuarterKey' , --
'CY ' + CONVERT(CHAR(4), CalendarYear) AS 'CalendarYearName' , -- CY 2005
'CY ' + CONVERT(CHAR(4), CalendarYear) + ' Qtr '
+ CONVERT(CHAR(1), CalendarQuarter) AS 'CalendarQuarterName' , -- CY 2005 Qtr 3
FiscalQuarter AS 'FiscalQuarter' ,
FiscalSemester AS 'FiscalSemester' ,
FiscalYear AS 'FiscalYear' ,
FiscalYear * 100 + FiscalQuarter AS 'FiscalQuarterKey' , --
'FY ' + CONVERT(CHAR(4), FiscalYear) AS 'FiscalYearName' , -- FY 2006
'FY ' + CONVERT(CHAR(4), FiscalYear) + ' Qtr '
+ CONVERT(CHAR(1), FiscalQuarter) AS 'FiscalQuarterName' -- FY 2006 Qtr 1
FROM DimDate
GO
数据处理:
--新增CheckDate字段
ALTER TABLE Tqc_Raw_Chemistry ADD CheckDate INT NULL
ALTER TABLE T_TIR_QualityModelAdmin ADD CheckDate INT NULL
ALTER TABLE T_QualMoisture_Middle ADD CheckDate INT NULL --将datetime转为int
UPDATE Tqc_Raw_Chemistry
SET CheckDate = CAST(REPLACE(CONVERT(CHAR(10), CheckTime, 120), '-', '') AS INT)
UPDATE T_TIR_QualityModelAdmin
SET CheckDate = CAST(REPLACE(CONVERT(CHAR(10), F_CheckDate, 120), '-', '') AS INT)
UPDATE T_QualMoisture_Middle
SET CheckDate = CAST(REPLACE(CONVERT(CHAR(10), T_Check_Date, 120), '-', '') AS INT) --删除CheckDate为NULL情况
DELETE FROM Tqc_Raw_Chemistry
WHERE CheckDate IS NULL
DELETE FROM T_TIR_QualityModelAdmin
WHERE CheckDate IS NULL
DELETE FROM T_QualMoisture_Middle
WHERE CheckDate IS NULL
《BI项目笔记》创建时间维度(1)的更多相关文章
- 《BI项目笔记》——微软BI项目笔记连载
本系列文章主要是结合实际项目,加上自己的总结,整理出来的一系列项目笔记,涉及微软SQL Server2008中商务智能开发中的SSAS.SSIS模块: 准备工作: <BI项目笔记>基于雪 ...
- 《BI项目笔记》创建时间维度(2)
创建步骤: 序号 选择的属性 重命名后的名称 属性类别 1 DateKey DateKey 常规 2 Month Key Month Key 月份 3 English Month Name Eng ...
- 《BI项目笔记》创建多维数据集Cube(1)
有两个事实表,因此就有两个度量值组,并且向导将为非维度键的事实表中的每一个数值列创建一个度量值.由于我们这里不需要那么多,所以只选择部分度量值.另外要注意,度量值的名称源于事实表中的列,所有名称由可能 ...
- 《BI项目笔记》创建多维数据集Cube(2)
本节建立: 历年的初烟水分均值变化分析Cube:区域维度:地州,专县时间维度:年等级维度:大等级,小等级指标:水分均值 数据源视图: 数据处理: ) ) DELETE FROM T_QualMoist ...
- 《BI项目笔记》增量ETL数据抽取的策略及方法
增量抽取 增量抽取只抽取自上次抽取以来数据库中要抽取的表中新增或修改的数据.在ETL使用过程中.增量抽取较全量抽取应用更广.如何捕获变化的数据是增量抽取的关键.对捕获方法一般有两点要求:准确性,能够将 ...
- 《BI项目笔记》多维数据集中度量值设计时的聚合函数
Microsoft SQL Server Analysis Services 提供了几种函数,用来针对包含在度量值组中的维度聚合度量值.默认情况下,度量值按每个维度进行求和.但是,通过 Aggrega ...
- 《BI项目笔记》历年理化指标分析Cube的建立
该系统属于数据仓库系统,与传统的管理信息系统有本质差别,是“面向主题”设计的.“面向主题”的方式,既有利于数据组织和利用,又有利于用户的理解和使用. 分析主题主要维度:烟叶级别.烟叶级别按等级信息.烟 ...
- 《BI项目笔记》历年的初烟水分均值变化分析Cube的建立
主要维度: 班组班次检测项质检日期(时间维度)加工客户加工类型收购类型生产线产地烟叶级别 主要指标:慢速测定_平均值快速测定_平均值红外测定_平均值ETL设计 需要抽取的维度表: 序号 表名 说明 备 ...
- 《BI项目笔记》历年感官评吸质量均值变化分析Cube的建立
分析主题主要维度:烟叶级别.烟叶级别按等级信息.烟叶级别按分级标准(标准维度)产地(父子维度)检测时间(时间维度,以Tqc_Raw_SmokingTest .CheckTime字段派生CheckDat ...
随机推荐
- php函数研究
<?php //$number = range(0,50,10); //print_r ($number); //生成一个自增的数组 header("Content-type:text ...
- PHP获取POST数据的几种方法汇总
一.PHP获取POST数据的几种方法 方法1.最常见的方法是:$_POST['fieldname']; 说明:只能接收Content-Type: application/x-www-form-urle ...
- ruby 分析日志,提取特定记录
读取日志中的每一行,分析后存入hash,然后做累加 adx_openx=Hash.new(0) File.open('watch.log.2016-08-24-21').each do |line| ...
- 什么是core dump linux下用core和gdb查询出现"段错误"的地方
什么是core dump linux下用core和gdb查询出现"段错误"的地方 http://blog.chinaunix.net/uid-26833883-id-31932 ...
- App软件开发的10个常用技巧
移动应用市场用户争夺战日益激烈,原来做APP拼想法拼创意拼是否抓住用户痛点.现在,精细化用户体验成为了一个APP能否留存用户的关键问题,一旦用户觉得体验不畅,马上就有竞品APP后补,如何开发高性能的移 ...
- Elasticsearch + logstash中文指南
http://kibana.logstash.es/content/logstash/examples/nginx-access.html http://es.xiaoleilu.com/030_Da ...
- 浏览器网页判断手机是否安装IOS/Android客户端程序
IOS 原理如下: 为HTML页面中的超链接点击事件增加一个setTimeout方法. 如果在iPhone上面500ms内,本机有应用程序能解析这个协议并打开程序,则这个回调方法失效: 如果本机没有应 ...
- jq 截取字符串
var str="abcde";截取ab;str=str.substring(0,2);意思是从第一个字符开始截取两位: 一.函数:split() 功能:使用一个指定的分隔符把一个 ...
- Scrum4.0+5.0
1.题目: 1.准备看板. 形式参考图4. 2.任务认领,并把认领人标注在看板上的任务标签上. 先由个人主动领任务,PM根据具体情况进行任务的平衡. 然后每个人都着手实现自己的任务. 3.为了团队合作 ...
- java栈与堆
java基本类型: 变量存放在栈区 java引用类型: 变量名存放在栈区,变量内容存放在堆区. 实例一: int a = 6; int b = 9; swap(int x, int y) { int ...