Chinaunix首页 | 论坛 | 博客
  • 博客访问: 223659
  • 博文数量: 31
  • 博客积分: 1427
  • 博客等级: 上尉
  • 技术积分: 409
  • 用 户 组: 普通用户
  • 注册时间: 2006-04-04 15:21
文章分类

全部博文(31)

文章存档

2008年(31)

我的朋友

分类: Mysql/postgreSQL

2008-04-02 11:25:08

每天一个日期

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

       列表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脚本之前,截去(truncatedate_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)

 

小结

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

阅读(1577) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~