mysql多维数据仓库指南--第二篇第6章(2)
时间:2008-04-02 来源:jiangdm
每天一个日期
第二种装载日期维的技术是“每天一个日期”,这种方式与预装载相似。然而,运用“每天一个日期”你每天只预装载一个日期记录,而不是一个时期的所有日期记录。用这个方法,你仍然拥有所有的日期不管它们是否有用,但你不是一次装载所有的日期。
列表6-2中的脚本向date_dim表装载当天的日期。你将安排该脚本每天运行一次。如果你的数据仓库数据装载也是每天一次,你可以将每天日期装载结合到它的维度装载部分中。
列表6-2:每天日期装载
/*****************************************************************/
/* */
/* daily_date.sql */
/* */
/*****************************************************************/
USE dw;
INSERT INTO date_dim VALUES
( NULL
, CURRENT_DATE
, MONTHNAME (CURRENT_DATE)
, MONTH (CURRENT_DATE)
, QUARTER (CURRENT_DATE)
, YEAR (CURRENT_DATE)
, '0000-00-00'
, '9999-12-31'
)
/* end of script
清空date_dim表然后运行列表6-2中的daily_date.sql脚本:
mysql> \. c:\mysql\scripts\daily_date.sql
如果你是在设置mysql日期为:2007-02-07后才运行该脚本,你将看到:
Database changed
Query OK, 1 row affected (0.27 sec)
为了证实date_dim表已经成功装载,查询该表:
mysql> select * from date_dim \G
date_dim表内容为:
*************************** 1. row ***************************
date_sk: 1
date: 2007-02-07
month_name: February
month: 2
quarter: 1
year: 2007
effective_date: 0000-00-00
expiry_date: 9999-12-31
1 row in set (0.00 sec)
mysql>
从源数据获得日期信息
本小节,我将阐述并介绍一个关于另外一种装载技术的例子。用这种技术,你能够通过从源数据获得日期来装载日期维。
当你从源数据获得日期信息来装载date_dim表,你的date_dim表将只存储需要用到的日期数据,这将节省你的磁盘空间。不幸的是,这种技术会比较复杂,因为你必须向日期维加载那些你的源数据拥有的所有日期信息。
列表6-3的脚本通过source数据库中的sales_order表向date_dim表载入销售订单日期。你应用DISTINCT关键字来确保没有重复的日期被装载。
列表6-3:从源数据载入日期
/*****************************************************************/
/* */
/* source_date.sql */
/* */
/*****************************************************************/
USE dw;
INSERT INTO date_dim
SELECT DISTINCT
NULL
, order_date
, MONTHNAME (order_date)
, MONTH (order_date)
, QUARTER (order_date)
, YEAR (order_date)
, '0000-00-00'
, '9999-12-31'
FROM source.sales_order
WHERE order_date NOT IN
(SELECT date FROM date_dim)
;
/* end of script
在你运行列表6-3脚本之前,截去(truncate)date_dim表数据,然后用下面命令运行source_date.sql脚本:
mysql> \. c:\mysql\scripts\source_date.sql
结果如下:
Database changed
Query OK, 1 row affected (0.23 sec)
Records: 1 Duplicates: 0 Warnings: 0
查询sales_order表和date_dim表确定正确的装载。所有源数据的日期必须插入到date_dim表中。你可以用这个命令查询源数据表:
mysql> select * from source.sales_order \G
结果如下:
*************************** 1. row ***************************
order_number: 17
customer_number: 1
product_code: 1
order_date: 2007-02-06
entry_date: 2007-02-06
order_amount: 1000.00
*************************** 2. row ***************************
order_number: 18
customer_number: 2
product_code: 1
order_date: 2007-02-06
entry_date: 2007-02-06
order_amount: 1000.00
*************************** 3. row ***************************
order_number: 19
customer_number: 3
product_code: 1
order_date: 2007-02-06
entry_date: 2007-02-06
order_amount: 4000.00
*************************** 4. row ***************************
order_number: 20
customer_number: 4
product_code: 1
order_date: 2007-02-06
entry_date: 2007-02-06
order_amount: 4000.00
4 rows in set (0.05 sec)
现在用这个命令查询date_dim表:
mysql> select * from date_dim \G
你将看到:
*************************** 1. row ***************************
date_sk: 1
date: 2007-02-06
month_name: February
month: 2
quarter: 1
year: 2007
effective_date: 0000-00-00
expiry_date: 9999-12-31
1 row in set (0.00 sec)
你会发现这个例子的源数据只有一个日期2007-02-06,因为只有这个日期被拷贝到date_dim表。
现在运行列表6-4 的脚本来增加一些销售订单数据,然后再次运行装载脚本(source_date.sql)。
列表6-4:通过新增的销售订单增加更多的日期
/*****************************************************************/
/* */
/* more_sales_order.sql */
/* */
/*****************************************************************/
USE source;
INSERT INTO sales_order VALUES
(21, 1, 3, '2007-02-07', '2007-02-07', 1000)
, (22, 2, 3, '2007-02-08', '2007-02-08', 1000)
, (23, 3, 3, '2007-02-09', '2007-02-09', 4000)
, (24, 4, 3, '2007-02-10', '2007-02-10', 4000)
;
/* end of script
你可以用如下命令运行列表6-4脚本
mysql> \. c:\mysql\scripts\more_sales_order.sql
然后用下面命令再次运行source_date.sql脚本
mysql> \. c:\mysql\scripts\source_date.sql
最后,来自源数据的四个日期被正确的装载到date_dim表中。
mysql> select * from date_dim \G
你的结果将如下所示:
*************************** 1. row ***************************
date_sk: 1
date: 2007-02-06
month_name: February
month: 2
quarter: 1
year: 2007
effective_date: 0000-00-00
expiry_date: 9999-12-31
*************************** 2. row ***************************
date_sk: 2
date: 2007-02-07
month_name: February
month: 2
quarter: 1
year: 2007
effective_date: 0000-00-00
expiry_date: 9999-12-31
*************************** 3. row ***************************
date_sk: 3
date: 2007-02-08
month_name: February
month: 2
quarter: 1
year: 2007
effective_date: 0000-00-00
expiry_date: 9999-12-31
*************************** 4. row ***************************
date_sk: 4
date: 2007-02-09
month_name: February
month: 2
quarter: 1
year: 2007
effective_date: 0000-00-00
expiry_date: 9999-12-31
*************************** 5. row ***************************
date_sk: 5
date: 2007-02-10
month_name: February
month: 2
quarter: 1
year: 2007
effective_date: 0000-00-00
expiry_date: 9999-12-31
5 row in set (0 .00 sec)
小结
本章,你学习到三种最常用的日期装载技术,包括他们的优点和缺点。你将测试一些脚本来完成日期维的装载。下一章,你将应用预装载技术。