分享OLAP的时间维度设计语句

简介: 时间维度在OLAP中是很常用,我们一般分为日期维度和时刻维度组成。我整理了如何生成他们的语句如下 1)日期维度[Dim_Date] View Code IF EXISTS(select * FROM sys.

时间维度在OLAP中是很常用,我们一般分为日期维度和时刻维度组成。我整理了如何生成他们的语句如下

1)日期维度[Dim_Date]

View Code
IF EXISTS(select * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Dim_Date]')AND type in(N'U'))
Drop table [dbo].[Dim_Date]
GO
CREATE TABLE [dbo].[Dim_Date](
    DateKey [int] NOT NULL,
    [TheDate] [datetime] NULL, --DateTime格式的日期
    [TheDateName] [nvarchar](10)NULL, --日期名称
    [TheYear] [smallint] NULL,--年份
    [TheYearName] [nvarchar](10)NULL,--年份名称
    [TheMonth] [smallint] NULL,--月份
    [TheMonthName] [nvarchar](10)NULL,--月份名称
    [TheDay] [smallint] NULL,--日
    [TheDayName] [nvarchar](10)NULL,--日的名称
    [TheQuarter] [smallint] NULL,--季度
    [TheQuarterName] [nvarchar](10)NULL,--季度名称
    [TheWeek] [smallint] NULL,--星期
    [TheWeekName] [nvarchar](10)NULL,--星期名称  
    [Vacation_Mark] [smallint] NULL,--节假日标志
    [TheWW] [smallint] NULL,--周
    [TheWWName] [nvarchar](20) NULL --周名称
)ON [PRIMARY]


DECLARE
@DateKey int,
@TheDate datetime,
@TheDateName nvarchar(10),                    
@TheYear smallint,    
@TheYearName nvarchar(10),
@TheMonth smallint,
@TheMonthName nvarchar(10),
@TheDay smallint,
@TheDayName nvarchar(10),
@TheQuarter smallint,
@TheQuarterName nvarchar(10),
@TheWeek smallint,                    
@TheWeekName nvarchar(10),
@Vacation_Mark smallint,
@TheWW smallint,
@TheWWName nvarchar(20),
@dDate DATETIME,--存储起始日期和结束日期
@adddays smallint--存储日期增量


SELECT @adddays = 1 --日期增量
--_select @dDate = '1/1/2000'--当前日期
--WHILE @dDate <= '12/31/2010'--结束日期
SELECT @dDate = '1/1/2012' --取当前系统时间维度表最大日期
WHILE @dDate <= '12/31/2012'--结束日期:当前日期往后顺延5年,可以根据实际需求设置时长
BEGIN

    select @DateKey=cast((left(convert(nvarchar,@dDate,23),4)+substring(convert(nvarchar,@dDate,23),6,2)+
substring(convert(nvarchar,@dDate,23),9,2))as int)
    SELECT @TheDate = @dDate
    SELECT @TheDateName = REPLACE(CONVERT(nvarchar(20),@dDate,111),'/','-')
    SELECT @TheYear = DATENAME(yy, @dDate)
    SELECT @TheYearName = CAST(@TheYear as nvarchar)+''
    SELECT @TheMonth = DATENAME(mm, @dDate)
    SELECT @TheMonthName =CAST(@TheMonth as nvarchar)+''
    SELECT @TheDay = DATENAME(dd, @dDate)
    SELECT @TheDayName = CAST(@TheDay as nvarchar)+''
    SELECT @TheQuarter = DATENAME(Quarter, @dDate)
    SELECT @TheQuarterName = '' + CAST(DATENAME(Quarter, @dDate)as varchar(1))+'季度'
    SELECT @TheWeek = DATEPART(dw, @dDate)
    SELECT @TheWeekName = DATENAME(dw,@dDate)
    SELECT @Vacation_Mark = CASE WHEN(@TheWeek = 1 OR @TheWeek = 7)THEN 1 ELSE 0 END
    select @TheWW= DATEPART(wk, @dDate)
    select @TheWWName=''+CAST(DATEPART(wk, @dDate)as varchar(2))+''  

INSERT INTO Dim_Date(DateKey,TheDate,TheDateName,TheYear,TheYearName,TheMonth,TheMonthName,TheDay,
                        TheDayName,TheQuarter,TheQuarterName,TheWeek,TheWeekName,Vacation_Mark,TheWW,TheWWName)VALUES
(@DateKey,@TheDate, @TheDateName,@TheYear,@TheYearName,@TheMonth,@TheMonthName,@TheDay,@TheDayName,@TheQuarter,
    @TheQuarterName,@TheWeek,@TheWeekName,@Vacation_Mark,@TheWW,@TheWWName)
   SELECT @dDate = @dDate + @adddays
END
GO

2)时刻维度[Dim_Time]

View Code
IF EXISTS(select* FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Dim_Time]')AND type in(N'U'))
Drop table [dbo].[Dim_Time]
CREATE TABLE [dbo].[Dim_Time](
    [TimeKey]  int IDENTITY(1,1)NOT NULL,
    [TheHour]  smallint NULL, --小时
    [TheHourName] nvarchar(5) NULL,--小时名称
    [HalfHour] smallint NULL, --半小时
    [HalfHourName] nvarchar(10)NULL, --半小时名称
    [Min] smallint NULL, --分钟
    [minName] nvarchar(10)NULL --分钟名称
)ON [PRIMARY]
DECLARE
@dHour smallint,
@addhours smallint,
@chour nvarchar(5),
@dhhour smallint,
@hhourname nvarchar(10),
@dMin smallint,
@dMinName nvarchar(10)
select @dHour = 0       --起始小时
select @dhhour = 1      --起始半小时
select @dmin = 0        --起始分钟
WHILE  @dHour <= 23
BEGIN
   WHILE @dmin <=59
         BEGIN
          select @dhhour =
        CASE
        WHEN @dMin >=0  and @dMin <=29  THEN 1
        WHEN @dMin >=30 and @dMin <=59  THEN 2 END
          select @hhourname =
        CASE
        WHEN @dhhour =1  THEN '前半小时'
        WHEN @dhhour =2  THEN '后半小时' END
        select @dMinName = cast(@dhour as nvarchar)+':'+(case when len(@dmin)=1 then('0'+cast(@dmin as nvarchar))       
         else cast(@dmin as nvarchar)end)
         select @chour = cast(@dhour as nvarchar)+ ':00'
insert INTO Dim_Time(TheHour,TheHourName,HalfHour,HalfHourName,Min,MinName)VALUES
       (@dHour,@chour,@dhhour,@hhourname,@dMin,@dMinName)
        select @dMin = @dMin + 1
        END
select @dmin = 0
select @dHour = @dHour + 1
END
GO
相关实践学习
数据库实验室挑战任务-初级任务
本场景介绍如何开通属于你的免费云数据库,在RDS-MySQL中完成对学生成绩的详情查询,执行指定类型SQL。
阿里云云原生数据仓库AnalyticDB MySQL版 使用教程
云原生数据仓库AnalyticDB MySQL版是一种支持高并发低延时查询的新一代云原生数据仓库,高度兼容MySQL协议以及SQL:92、SQL:99、SQL:2003标准,可以对海量数据进行即时的多维分析透视和业务探索,快速构建企业云上数据仓库。 了解产品 https://www.aliyun.com/product/ApsaraDB/ads
目录
相关文章
|
11月前
|
SQL Cloud Native 安全
10倍性能提升,一文读懂AnalyticDB秒级漏斗分析函数
AnalyticDB MySQL秒级漏斗分析函数助力企业简单快速研判用户增长
10563 2
|
SQL BI Serverless
【SQL开发实战技巧】系列(二十):数据仓库中时间类型操作(进阶)获取季度开始结束时间以及如何统计非连续性时间的数据
本篇文章讲解的主要内容是:***汇总报表时常要求按季度分类汇总这就需要通过给定年份获取对应的季度开始结束时间、业务数据不连续的情况下如何统计所有年份数据、如何统计相同月份与周内日期聘用的员工、如何返回2月或12月聘用的所有员工以及周二聘用的所有员工***
【SQL开发实战技巧】系列(二十):数据仓库中时间类型操作(进阶)获取季度开始结束时间以及如何统计非连续性时间的数据
|
SQL 关系型数据库 MySQL
mysql聚合统计数据查询缓慢优化方案
在我们日常操作数据库的时候,比如订单表、访问记录表、商品表的时候。 经常会处理计算数据列总和、数据行数等统计问题。 随着业务发展,这些表会越来越大,如果处理不当,查询统计的速度也会越来越慢,直到业务无法再容忍。 所以,我们需要先了解、思考这些场景知识点,在设计之初,便预留一些优化空间支撑业务发展。
637 0
|
存储 SQL 分布式计算
总结OLAP系统核心技术点,每一点都值得单独收藏
  OLAP系统广泛应用于BI、Reporting、Ad-hoc、ETL数仓分析等场景,本文主要从体系化的角度来分析OLAP系统的核心技术点,从业界已有的OLAP中萃取其共性,分为谈存储,谈计算,谈优化器,谈趋势4个章节。   一、谈存储   1、列存的数据组织形式   行存,可以看做NSM (N-ary Storage Model)组织形式,一直伴随着关系型数据库,对于OLTP场景友好,例如innodb[1]的B+树聚簇索引,每个Page中包含若干排序好的行,可以很好的支持tuple-at-a-time式的点查以及更新等。   而列存(Column-oriented Storage)
491 0
|
存储 OLAP 数据库
【DBMS 数据库管理系统】OLAP 核心技术 : 数据方体 ( 数据方体 | 数据方体格结构 | 数据单元 )
【DBMS 数据库管理系统】OLAP 核心技术 : 数据方体 ( 数据方体 | 数据方体格结构 | 数据单元 )
186 0
|
SQL 分布式计算 数据可视化
关于内部OLAP工具的一些设计思路
更新: 内部olap工具终于来了 https://deepinsight.alipay.com/index.htm#/list/self-analysis ----------------------------------------------------- 最近一年在蚂蚁接触了很多的数据分析需求,会用到各种交付工具,总的来说是非常方便的,唯一一个没有找到最佳实践的需求场景是OL
360 0
关于内部OLAP工具的一些设计思路
|
SQL 时序数据库 Apache
时序时空数据库新增TSQL语言:通过SQL即可让监控分析更简单更高效
阿里时序时空数据库TSDB最新推出TSQL,支持标准SQL的语法和函数。用户使用熟悉的SQL,不仅仅查询更简单易用,用户还可以利用SQL强大的功能,实现更加复杂的计算分析。
2655 0
|
大数据 OLAP 数据处理
实时数据平台设计:解决从OLTP到OLAP实时流转缺失
本文将会分上下两篇对一个重要且常见的大数据基础设施平台展开讨论,即“实时数据平台”。
3138 0

热门文章

最新文章