生成數倉時間維度表


做系統設計以及涉及數據分析的時候,會涉及到各種期間維度的統計計算。

可以按日期生成期間維度表,如下:

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