生成数仓时间维度表


做系统设计以及涉及数据分析的时候,会涉及到各种期间维度的统计计算。

可以按日期生成期间维度表,如下:

1.按期间生成日期表

DROP TABLE IF EXISTS `v_day`;

CREATE TABLE `v_day` (
`oc_date` varchar(20) DEFAULT NULL
);
2.调用方法为输入开始结束日期,生成期间的日期

DELIMITER $$

DROP PROCEDURE IF EXISTS `sp_gen_dates`$$

CREATE PROCEDURE `sp_gen_dates` (
param_begin_date VARCHAR (20),
param_end_date VARCHAR (20)
)
BEGIN
DECLARE cur_date,
end_date VARCHAR (20) ;
SET cur_date = DATE_FORMAT(param_begin_date, '%Y-%m-%d') ;
SET end_date = DATE_FORMAT(param_end_date, '%Y-%m-%d') ;
WHILE
cur_date < end_date DO
INSERT INTO v_day (oc_date)
VALUES
(cur_date) ;
SET cur_date = DATE_ADD(cur_date, INTERVAL 1 DAY) ;
END WHILE ;
END $$

DELIMITER ;

2.生成日期维度表

# time span

SET @d0 = "2012-01-01";

SET @d1 = "2035-12-31";

SET @date = DATE_SUB(@d0, INTERVAL 1 DAY);

# set up the time dimension table

DROP TABLE IF EXISTS time_dimension;

CREATE TABLE `time_dimension` (

`date` DATE DEFAULT NULL,

`id` INT NOT NULL,

`y` SMALLINT DEFAULT NULL,
`ym` INT DEFAULT NULL,
`m` SMALLINT DEFAULT NULL,

`d` SMALLINT DEFAULT NULL,

`yw` SMALLINT DEFAULT NULL,

`w` SMALLINT DEFAULT NULL,

`q` SMALLINT DEFAULT NULL,

`wd` SMALLINT DEFAULT NULL,

`m_name` CHAR(10) DEFAULT NULL,

`wd_name` CHAR(10) DEFAULT NULL,

PRIMARY KEY (`id`)

);

# populate the table with dates

INSERT INTO time_dimension

SELECT @date := DATE_ADD(@date, INTERVAL 1 DAY) AS DATE,

# integer ID that allowsimmediate understanding

DATE_FORMAT(@date, "%Y%m%d")AS id,

YEAR(@date) AS Y,

DATE_FORMAT(@date, '%Y%m') AS 'ym',

MONTH(@date) AS m,

DAY(@date) AS d,

DATE_FORMAT(@date, "%x")AS yw,

WEEK(@date, 3) AS w,

QUARTER(@date) AS q,

WEEKDAY(@date)+1 AS wd,

MONTHNAME(@date) AS m_name,

DAYNAME(@date) AS wd_name

FROM v_day

WHERE DATE_ADD(@date, INTERVAL 1 DAY) <= @d1

ORDER BY DATE;


SELECT * FROM time_dimension;


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM