SSAS-时间维度的标准设计

1、首先要构建一个时间维度表,下面给出通用的构建时间维度的存储过程:

USE [BI_DW]
GO
/****** Object:  StoredProcedure [dbo].[proc_Dim_date]    Script Date: 05/20/2016 11:35:58 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER  proc [dbo].[proc_Dim_date]
as
 begin

IF OBJECT_ID(‘dbo.Dim_Date‘) IS NOT NULL
 DROP TABLE dbo.[Dim_Date]

CREATE TABLE [dbo].[Dim_Date](
 [DateKey] [int] NULL,
 [Date] [datetime] NULL,
 [Year] [float] NULL,
 [Month] [float] NULL,
 [Month EN] [nvarchar](50) NULL,
 [Month Short EN] [nvarchar](50) NULL,
 [Month CN] [nvarchar](50) NULL,
 [Day] [float] NULL,
 [Quarter] [float] NULL,
 [Quarter EN] [nvarchar](50) NULL,
 [Quarter CN] [nvarchar](50) NULL,
 [Weekday] [float] NULL,
 [Weekday CN] [nvarchar](50) NULL,
 [Weekday Short EN] [nvarchar](50) NULL,
 [Week of Year] [float] NULL,
 [Day of Year] [float] NULL,
 [SemiYearly] [nvarchar](50) NULL,
 [Period of Ten Days] [nvarchar](10) NULL,
 [Period of Index] [nvarchar](2) NULL,
 [Weekend] [nvarchar](5) NULL
) ON [PRIMARY]

SET DATEFIRST 7 --设周日为每周的第一天

--向日期表插入数据
DECLARE @b1 DATETIME
set @b1=‘2010-01-01‘     --设置起始日期 

WHILE @b1<dateadd(day,2,GETDATE())   --设置截止日期
BEGIN
 INSERT INTO dbo.[Dim_Date] (
  [DateKey],
  [Date],
  [Year],
  [Month],
  [Month EN],
  [Month Short EN],
  [Month CN],
  [Day],
  [Quarter],
  [Quarter EN],
  [Quarter CN],
  [Weekday],
  [Weekday CN],
  [Weekday Short EN],
  [Week of Year],
  [Day of Year],
  [SemiYearly],
  [Period of Ten Days],
  [Period of Index] ,
  [Weekend]
 )
 VALUES(
   CONVERT(NVARCHAR(10),@b1,112),  --DateKey 1
   @b1, --Date 2
   DATEPART(year, @b1), --Year 3
   DATEPART(month, @b1), --Month 4
   CASE --Month EN 5
     when (DATEPART(month, @b1))=‘1‘ then ‘January‘
     when (DATEPART(month, @b1))=‘2‘ then ‘February‘
     when (DATEPART(month, @b1))=‘3‘ then ‘March‘
     when (DATEPART(month, @b1))=‘4‘ then ‘April‘
     when (DATEPART(month, @b1))=‘5‘ then ‘May‘
     when (DATEPART(month, @b1))=‘6‘ then ‘June‘
     when (DATEPART(month, @b1))=‘7‘ then ‘July‘
     when (DATEPART(month, @b1))=‘8‘ then ‘August‘
     when (DATEPART(month, @b1))=‘9‘ then ‘September‘
     when (DATEPART(month, @b1))=‘10‘ then ‘October‘
     when (DATEPART(month, @b1))=‘11‘ then ‘November‘
     else ‘December‘
   END,
   CASE --Month Short En 6
    when (DATEPART(month, @b1))=‘1‘ then ‘Jan‘
    when (DATEPART(month, @b1))=‘2‘ then ‘Feb‘
    when (DATEPART(month, @b1))=‘3‘ then ‘Mar‘
    when (DATEPART(month, @b1))=‘4‘ then ‘Apr‘
    when (DATEPART(month, @b1))=‘5‘ then ‘May‘
    when (DATEPART(month, @b1))=‘6‘ then ‘Jun‘
    when (DATEPART(month, @b1))=‘7‘ then ‘Jul‘
    when (DATEPART(month, @b1))=‘8‘ then ‘Aug‘
    when (DATEPART(month, @b1))=‘9‘ then ‘Sep‘
    when (DATEPART(month, @b1))=‘10‘ then ‘Oct‘
    when (DATEPART(month, @b1))=‘11‘ then  ‘Nov‘
    else ‘Dec‘
   END,
      CASE --Month CN 7
       when (DATEPART(month, @b1))=‘1‘ then N‘一月‘
    when (DATEPART(month, @b1))=‘2‘ then N‘二月‘
    when (DATEPART(month, @b1))=‘3‘ then N‘三月‘
    when (DATEPART(month, @b1))=‘4‘ then N‘四月‘
    when (DATEPART(month, @b1))=‘5‘ then N‘五月‘
    when (DATEPART(month, @b1))=‘6‘ then N‘六月‘
    when (DATEPART(month, @b1))=‘7‘ then N‘七月‘
    when (DATEPART(month, @b1))=‘8‘ then N‘八月‘
    when (DATEPART(month, @b1))=‘9‘ then N‘九月‘
    when (DATEPART(month, @b1))=‘10‘ then N‘十月‘
    when (DATEPART(month, @b1))=‘11‘ then  N‘十一月‘
    else N‘十二月‘
   END,
   DATEPART(day, @b1),--day  8
   DATEName (qq, @b1),--quarter 9
   CASE   --quarter en  10
    when DATEName (qq, @b1)=‘1‘ then ‘Q1‘
    when DATEName (qq, @b1)=‘2‘ then ‘Q2‘
    when DATEName (qq, @b1)=‘3‘ then ‘Q3‘
    else  ‘Q4‘
   END,
         CASE  --quarter cn  11
    when DATEName (qq, @b1)=‘1‘ then N‘一季度‘
    when DATEName (qq, @b1)=‘2‘ then N‘二季度‘
    when DATEName (qq, @b1)=‘3‘ then N‘三季度‘
    else  N‘四季度‘
   END,
   DATEPART(dw, @b1),--Weekday 12
   CASE --Weekday CN  13
    when DATEPART(dw, @b1)=1 then  N‘星期日‘
    when DATEPART(dw, @b1)=2 then  N‘星期一‘
    when DATEPART(dw, @b1)=3 then  N‘星期二‘
    when DATEPART(dw, @b1)=4 then  N‘星期三‘
    when DATEPART(dw, @b1)=5 then  N‘星期四‘
    when DATEPART(dw, @b1)=6 then  N‘星期五‘
    else N‘星期六‘
   END,
   CASE --Weekday Short EN 14  --注意,周日是第一天.
    when DATEPART(dw, @b1)=‘1‘ then ‘Sun‘
    when DATEPART(dw, @b1)=‘2‘ then ‘Mon‘
    when DATEPART(dw, @b1)=‘3‘ then ‘Tue‘
    when DATEPART(dw, @b1)=‘4‘ then ‘Wed‘
    when DATEPART(dw, @b1)=‘5‘ then ‘Thu‘
    when DATEPART(dw, @b1)=‘6‘ then ‘Fri‘
    else ‘Sat‘
   END,
   DATEName (wk, @b1),--week of year 15
   DATEName (dy, @b1),--day of year  16
   CASE --SemiYearly 17
    when DATEPART(month, @b1)<=6 then N‘上半年‘
    else N‘下半年‘
   END,
      CASE  --Period of Ten Days 18
    when DATEName (dd, @b1)<=10 then N‘上旬‘
    when DATEName (dd, @b1)>20  then N‘下旬‘
    else N‘中旬‘
   END,
      CASE  --Period of Ten Days 19
    when DATEName (dd, @b1)<=10 then N‘1‘
    when DATEName (dd, @b1)>20  then N‘3‘
    else N‘2‘
   END,
   CASE --Is it Weekend? 20
    when DATEPART(dw, @b1)=‘1‘ then ‘周末‘
    when DATEPART(dw, @b1)=‘7‘ then ‘周末‘
    else ‘平时‘
   END
)
--日期加1天
 set @b1=DATEADD(day, 1, @b1)
END
end

2、在数据库中构建这样的维度表之后,在SSAS出新建维度,这里就不再多说了。

重点介绍如何构建一个标准的时间维度,首先,打开维度设计选项卡,添加下面两套成员用来构建标准时间维度,按照图中的样子:

3、设置属性:

3.1 将Dim Date的属性“TYPE”设置为:Time

3.2 将带有“层级”的成员属性设置为:以“Day-层级”为例:Type =Days; KeyColumms =‘内容见“键列”图‘,这里选择了组合键(确保在层级中“Day”是唯一的);所以需要设置NameColumns,将NameColumns=‘Day‘用来显示成员而已。

3.3 带有层级的其他成员都按照3.2的设置,具体有不同:Year-层级的Type=‘Years‘ ,Month-层级的Type=‘Months‘ ,Quater-层级的Type=‘Quaters‘;当然还要选择NameColumn的相应字段用来显示。KeyColumns的组合字段的选择,只要符合保证唯一即可,例如Month的KeyColumns:

3.4 按照以上步骤,设置好之后,还是不行的,还需要将属性关系设置合理才行,按照下图的属性关系设置即可;设置成员的属性的时候,最好将成员的order by属性设置为“Key”,这样浏览的数据就会按照key排序了;除了带有层级的成员属性外,其他属性可以不需要额外设置即可;

3.5  这样处理维度,浏览查看效果:

时间: 2024-10-26 19:02:41

SSAS-时间维度的标准设计的相关文章

ssas 时间维度表 sql 代码

该代码转自 天善智能社区 文章 文章地址:https://ask.hellobi.com/blog/biwork/572 ----------------------------------------------------------------------- BIWORK DimDate and vDimDate Demo----------------------------------------------------------------------USE BIWORK_SSIS

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

原文:<BI项目笔记>创建时间维度(1) SSAS Date 维度基本上在所有的 Cube 设计过程中都存在,很难见到没有时间维度的 OLAP 数据库.但是根据不同的项目需求, Date 维度的设计可能不大相同,所以在设计时间维度的时候需要搞清楚几个问题: 你的业务涉及到的最低的细节级别是什么?比如按季度查看报表还是按月份,或者按周,或者再甚者按天.这个细节级别需要弄清楚,比如在一些销售数据统计,有的时候可能更多按季度或者按月来查看报表.但在有的监控一些机器运行数据的统计,可能会按照小时或者分

mysql中生成时间维度表

利用mysql常用日期函数生成时间维度表,效率最高,最简单,无需其他的一些工具支持.生成结果示例如下图: # time span SET @d0 = "2012-01-01"; SET @d1 = "2012-12-31"; SET @date = date_sub(@d0, interval 1 day); # set up the time dimension table DROP TABLE IF EXISTS time_dimension; CREATE T

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

创建步骤:   序号 选择的属性 重命名后的名称 属性类别 1 DateKey DateKey 常规 2 Month Key Month Key 月份 3 English Month Name English Month Name 每年的某一月 4 Month Number Of Year Month Number Of Year 常规 5 Calendar Quarter Key Calendar Quarter Key 季度 6 Calendar Quarter Calendar Quart

HBase中的时间维度

HBase是一个类Bigtable系统,按照Google的论文对 Bigtable的定义是"一种稀疏的,分布式的,持久的多为维度的有序Map.这个Map由row key,column key和timestamp做为索引,Map中的值是连续的byte数组".HBase的多维度,包括table和column family等. 不是所有维度都是等同的,不同的维度有其特殊的意义.例如,row这个维度用于region切分,所以可以增长到海量.而column则不用于分 片,和row不同的是,一个r

SSAS 系列 - 维度的优化,&quot;灌木丛属性关系&quot; 以及自然层次结构与非自然层次结构的概念

维度的优化 在 SSAS 开发设计过程中,维度的优化非常重要,因为它在 SSAS 分析服务性能调优的过程中往往能起到一个非常重要的作用. 一般来说,对于 Cube 的性能优化第一步可能考虑的就是查看维度,观察维度中属性关系的设计. 这里有两种最重要的调优方法可以参考: 确认属性关系 有效的使用用户自定义的层次结构 定义属性关系 属性关系定义了属性之间的依赖关系,比如如果 A 有一个关联的属性 B, 那么就是 A -> B.比如,一个给定的属性关系 City -> State, 如果当前的城市是

SSAS的维度表之间的关系只能有一个不能有多个

我们在SSAS中创建维度的时候,有时候可能一个维度需要用到多个表的字段作为维度属性,那么这多个表之间势必存在关联关系,但是切记维度表之间的关联关系有且只能有一个不能有多个,下面我们来看一个例子. 现在我们创建了一个维度Customer,由于该维度中的属性除了用到Customer表的字段以外,还要用到了Geography表的字段,所以Customer用到了两个表. 但是Customer表和Geography表之间现在存在两个依赖关系 其中一个关系是Customer.CustomerKey到Geog

SSAS Cube 维度成员关系Rigid 和 Flexible

      维度成员关系指示成员关系是否随时间而更改.  值为 Rigid 和 Flexible,前者表示成员之间的关系不随时间而更改,后者表示成员之间的关系随时间而更改. 默认值为 Flexible. 如果您将关系定义为 Flexible(柔性),则将删除聚合并作为增量更新的一部分重新计算(如果只添加了新成员,则将不删除聚合). 如果您将关系定义为 Rigid(刚性),则 Analysis Services 会在增量更新维度时保留聚合. 如果定义为刚性的关系发生了实际更改,Analysis S

Mysql时间维度表

1.建一张表test_date用来日期的自增长,里面只放一列  ID,写一个存储,插入顺序数字 BEGIN #Routine body goes here... declare id int; set id=1; while id<=6000 do insert into test_date values(id); set id=id+1; end while; END 2. 建立时间维度表,插入记录 SET @d0 = "2000-01-01"; SET @d1 = "