大家建时间维度表 时间粒度通常有哪些啊

0
已邀请:
1

BAO胖子 - 15年BI经验,涉足电力,快消品,医药,信息服务等行业的BI老兵。 2015-09-18 回答

大概的ER图如下所示,你可以根据自己的需求进行一定的逆规范化,不见得非得用这么多表。
图像.png

一般来说,时间和日期是分开的维度,一个时间戳数据可以分解成日期 + 时间。我所接触过的项目时间最细是到分钟一级,那么该表一共是24 * 60 = 1440 条记录。
 
日期到天一级的话,无非是分两条线,一条是日->月->季度->半年->年;另外一条是日->周,由于周可能跨月/季度/年,很少会将周统计到月份中的需求。但财务月/财务季大部分都是按照周统计的,比如按照4-5-4的模式将完整的周归并到财务月份中,这个都是财年开始之前预先定义的,因此这条线是日->周->财务月->财务季度->财务年。
 
如上的ER图基本涵盖以上的内容,还可以在各个维度表中增加更多的派生字段,比如财务季度里面增加total working day这类信息,我给出的例子里面有的添加了类似字段,有的没有,这个根据项目的实际需求而定。
 
此外,还有一些更复杂的场景,比如如果需要统计公共假期就需要增加public holiday indicator这样的字段,而如果项目是需要考虑多个国家的情况,就需要创建单独的表进行维护这类信息。再比如,如淘宝双十一,这类特殊的促销季活动,也需要创建另外的表进行此类信息的维护。
 
另外的场景还有,一个公司可能有多种财务日历的情况,比如销售和生产的采用的日历不同,母公司和子公司采用的日历不同等等,这些就需要再创建不同日历分类的表并和对应的部门/公司关联起来。这类场景相对少见,此处没有给出样例。
 
此外,还有单纯用于统计分析,尤其是对比分析的“日历表”,像在零售活动中,本年与去年同期的对比时间有的时候没有实际的意义,例如中秋节,每两年对应的日期或有不同,这类情况也可以单独创建日历对照表进行维护。
 
以上。
 
1

BIWORK - 热衷于微软BI技术,技术架构和解决方案! 2015-09-17 回答

时间粒度通常到天,最常用的比如像销售数据基本上都是统计到天,之上再是周、月、季度、上下半年、年。
也有到小时的,比如租车里面,需要到小时这个粒度来分析全天租车、提车、还车的情况等等。
 
下面这个脚本是到天的,包括财年,可以自行修改或者创建存储过程。
USE BIWORK_SSIS
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 = '2013-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
-1

landau 2015-09-18 回答

不错不错不错不错不错不错不错不错不错不错

要回复问题请先登录注册