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)的更多相关文章

  1. 《BI项目笔记》——微软BI项目笔记连载

    本系列文章主要是结合实际项目,加上自己的总结,整理出来的一系列项目笔记,涉及微软SQL Server2008中商务智能开发中的SSAS.SSIS模块:  准备工作: <BI项目笔记>基于雪 ...

  2. 《BI项目笔记》创建时间维度(2)

    创建步骤:   序号 选择的属性 重命名后的名称 属性类别 1 DateKey DateKey 常规 2 Month Key Month Key 月份 3 English Month Name Eng ...

  3. 《BI项目笔记》创建多维数据集Cube(1)

    有两个事实表,因此就有两个度量值组,并且向导将为非维度键的事实表中的每一个数值列创建一个度量值.由于我们这里不需要那么多,所以只选择部分度量值.另外要注意,度量值的名称源于事实表中的列,所有名称由可能 ...

  4. 《BI项目笔记》创建多维数据集Cube(2)

    本节建立: 历年的初烟水分均值变化分析Cube:区域维度:地州,专县时间维度:年等级维度:大等级,小等级指标:水分均值 数据源视图: 数据处理: ) ) DELETE FROM T_QualMoist ...

  5. 《BI项目笔记》增量ETL数据抽取的策略及方法

    增量抽取 增量抽取只抽取自上次抽取以来数据库中要抽取的表中新增或修改的数据.在ETL使用过程中.增量抽取较全量抽取应用更广.如何捕获变化的数据是增量抽取的关键.对捕获方法一般有两点要求:准确性,能够将 ...

  6. 《BI项目笔记》多维数据集中度量值设计时的聚合函数

    Microsoft SQL Server Analysis Services 提供了几种函数,用来针对包含在度量值组中的维度聚合度量值.默认情况下,度量值按每个维度进行求和.但是,通过 Aggrega ...

  7. 《BI项目笔记》历年理化指标分析Cube的建立

    该系统属于数据仓库系统,与传统的管理信息系统有本质差别,是“面向主题”设计的.“面向主题”的方式,既有利于数据组织和利用,又有利于用户的理解和使用. 分析主题主要维度:烟叶级别.烟叶级别按等级信息.烟 ...

  8. 《BI项目笔记》历年的初烟水分均值变化分析Cube的建立

    主要维度: 班组班次检测项质检日期(时间维度)加工客户加工类型收购类型生产线产地烟叶级别 主要指标:慢速测定_平均值快速测定_平均值红外测定_平均值ETL设计 需要抽取的维度表: 序号 表名 说明 备 ...

  9. 《BI项目笔记》历年感官评吸质量均值变化分析Cube的建立

    分析主题主要维度:烟叶级别.烟叶级别按等级信息.烟叶级别按分级标准(标准维度)产地(父子维度)检测时间(时间维度,以Tqc_Raw_SmokingTest .CheckTime字段派生CheckDat ...

随机推荐

  1. Oracle 10g ORA-01034: ORACLE not available 错误

    今天在开发系统的时候,刚开始还好好的,突然就遇到了一个错误 ORA-01034: ORACLE not available 感到莫名其妙.然后排查问题 监听器ok,各项服务ok. 最后解决办法如下: ...

  2. centos安装php-memcached扩展及cas用法

    一.安装libmemcachedwget https://launchpad.net/libmemcached/1.0/1.0.16/+download/libmemcached-1.0.16.tar ...

  3. Web Api 中Get 和 Post 请求的多种情况分析

    转自:http://www.cnblogs.com/babycool/p/3922738.html 来看看对于一般前台页面发起的get和post请求,我们在Web API中要如何来处理. 这里我使用J ...

  4. Wordpress基础:精简头部wp_head

    在Wordpress里 <?php wp_head(); ?> wp_head()是一个重要的函数,它允许插件开发者向你的站点动态地添加CSS和javascript,如果我们不在模板中引入 ...

  5. 关于echarts的疑问

    echarts-例子--待解决:模拟迁徙里面的 var planePath = 'path://M1705.06,1318.313v-89.254l-319.9-221.799l0.073-208.0 ...

  6. [HTML5]移动开发不同手机弹出数字键盘问题

    这里还是先那么先交代一下遇到的问题.其实无论是tel还是number都不是完美的:type="tel"优点是iOS和Android的键盘表现都差不多缺点是那些字母好多余,虽然我没有 ...

  7. ios -- 教你如何轻松学习Swift语法(三) 完结篇

    前言:swift语法基础篇(二)来了,想学习swift的朋友可以拿去参考哦,有兴趣可以相互探讨,共同学习哦.      一.自动引用计数   1.自动引用计数工作机制      1.1 swift和o ...

  8. mac上mysql乱码问题解决

    一.mysql出现乱码问题: 出现的问题是下图这样的乱码问题,我是使用java在做练习的时候发现出现字符集编码问题的: 当时是使用jdbc来添加的数据,我的jdbc包括web前端后端的编码都是设置的是 ...

  9. cat *.txt | grep '>' | wc -l

    find the line where the '>' located, and make a statistic.

  10. Java关于md5加密

    package com.mi.util; /** * md5+salt 长度为32的加密 * @author admin * */ public class MD5 { public static v ...