mysql多维数据仓库指南--第二篇第6章(2)

每天一个日期

       第二种装载日期维的技术是“每天一个日期”,这种方式与预装载相似。然而,运用“每天一个日期”你每天只预装载一个日期记录,而不是一个时期的所有日期记录。用这个方法,你仍然拥有所有的日期不管它们是否有用,但你不是一次装载所有的日期。

       列表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       <span style="font-family: 'Times New Roman'; background-color: rgb(255, 255, 255);">                     </span>

清空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)

 

小结

本章,你学习到三种最常用的日期装载技术,包括他们的优点和缺点。你将测试一些脚本来完成日期维的装载。下一章,你将应用预装载技术。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值