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

本文涉及的产品
云原生数据仓库AnalyticDB MySQL版,基础版 8ACU 100GB 1个月
简介: 时间维度在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
相关实践学习
阿里云云原生数据仓库AnalyticDB MySQL版 使用教程
云原生数据仓库AnalyticDB MySQL版是一种支持高并发低延时查询的新一代云原生数据仓库,高度兼容MySQL协议以及SQL:92、SQL:99、SQL:2003标准,可以对海量数据进行即时的多维分析透视和业务探索,快速构建企业云上数据仓库。 了解产品 https://www.aliyun.com/product/ApsaraDB/ads
目录
相关文章
|
机器学习/深度学习 自然语言处理 安全
LLM系列 | 12: 如何编写思维链Prompt?以智能客服为例
本文介绍如何编写ChatGPT的思维链Prompt从而为用户提供智能客服服务。在智能客服场景中,经常会有用户询问对比各种产品的价格,如何让智能客服提供准确的答案?这就需要在构建Prompt过程中引入思维链的编写方式。
|
数据采集 JSON JavaScript
Python爬虫案例:抓取猫眼电影排行榜
python爬取猫眼电影排行榜数据分析,实战。(正则表达式,xpath,beautifulsoup)【2月更文挑战第11天】
540 2
Python爬虫案例:抓取猫眼电影排行榜
|
6月前
|
人工智能 自然语言处理 安全
企业本地化部署实战:基于Websoft9构建私有化生产力平台
在数字化转型中,本地化部署成为企业掌控数据主权与应用灵活性的重要选择。本文探讨通过Websoft9面板的本地部署,结合EPP、AI工具和知识库,构建高效安全的企业生产力平台。内容涵盖本地部署优势、Websoft9核心能力、部署实践及关键应用场景,助企业在安全与效率间找到平衡点,让技术真正服务于人。
216 6
|
存储 数据采集 数据处理
【Flume拓扑揭秘】掌握Flume的四大常用结构,构建强大的日志收集系统!
【8月更文挑战第24天】Apache Flume是一个强大的工具,专为大规模日志数据的收集、聚合及传输设计。其核心架构包括源(Source)、通道(Channel)与接收器(Sink)。Flume支持多样化的拓扑结构以适应不同需求,包括单层、扇入(Fan-in)、扇出(Fan-out)及复杂多层拓扑。单层拓扑简单直观,适用于单一数据流场景;扇入结构集中处理多源头数据;扇出结构则实现数据多目的地分发;复杂多层拓扑提供高度灵活性,适合多层次数据处理。通过灵活配置,Flume能够高效构建各种规模的数据收集系统。
251 0
|
11月前
|
存储 安全 Java
jdk21的外部函数和内存API(MemorySegment)(官方翻译)
本文介绍了JDK 21中引入的外部函数和内存API(MemorySegment),这些API使得Java程序能够更安全、高效地与JVM外部的代码和数据进行互操作,包括调用外部函数、访问外部内存,以及使用不同的Arena竞技场来分配和管理MemorySegment。
364 1
jdk21的外部函数和内存API(MemorySegment)(官方翻译)
|
SQL 微服务
成功解决 :status 500 reading CouponFeignService#saveSpuBounds(SpuBoundTo)
这篇文章讲述了作者在微服务项目开发中遇到的一个具体问题:使用Feign进行远程服务调用时出现了`status 500`错误。文章详细描述了排查过程,包括检查Feign配置和被调用服务的日志信息,最终确定问题是由于Lombok插件的`@Data`注解导致。作者通过将`@Data`注解注释掉并手动生成get、set方法解决了问题,并提供了成功调用远程服务后的截图。
成功解决 :status 500 reading CouponFeignService#saveSpuBounds(SpuBoundTo)
|
Java
Java 继承深度剖析:子类与父类之间的“血缘”关系,如何传承与革新?
【6月更文挑战第16天】Java 继承体现类之间的&quot;血缘&quot;关系,子类继承父类的属性和方法,如`Student`继承`Person`。子类可扩展或覆盖父类功能,如`Student`的`introduce()`,展示代码复用和定制。同样,`Shape`的子类`Circle`和`Square`继承并定制`draw()`方法,形成多样的类结构,适应不同场景,增强代码组织和效率。
207 4
|
Linux 测试技术 Docker
软件测试|使用docker搞定 Python环境搭建
软件测试|使用docker搞定 Python环境搭建
|
算法 Java 开发者
Java:求正整数分解为质因数Java
Java:求正整数分解为质因数Java
|
存储 Python Windows
windows创建python虚拟环境
本文有2种创建python虚拟环境的方式, 如果第二种方式有问题, 建议使用第一种方式!
windows创建python虚拟环境