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

全部博文(31)

文章存档

2008年(31)

我的朋友

分类: Mysql/postgreSQL

2008-10-23 15:23:30

12: 子集维度

       一些用户从来就不需要大部分的详细数据。例如:他们通常想要某个月的记录而不是某些具体日期的。他们可能对某个地区的数据远比全国的销售数据更感兴趣。这些特定的维是由详细维数据中选取的几个记录组成的,因此称它们为维度的子集。由于维度子集远比详细维度更小,所以它们更加容易被使用而且能提供更快捷的响应。

    在本章,你将预备两个特定的维度,这两个维产生自现有的维:月份向上钻取维(日期维的子集)和宾夕法尼亚州地区客户维(一个客户维的子集)。

月份向上钻取维

       本节,我将解释月份向上钻取维的装载过程以及它的测试。

       列表12-1所示的脚本中,产生了月份向上钻取维表,并通过日期维度初始化装载了月份数据。注意到 promo_ind 字段不包括在该维中。该字段不适用于月份这个级别,因为在一个月份中你可能有不止一个的促销活动。确切的,促销应该应用在日期级别上。

 

列表 12-1:实现月份向上钻取维

/*****************************************************************/

/*                                                             */

/* month_rollup_dim.sql                                        */

/*                                                             */

/*****************************************************************/

 

USE dw;

 

CREATE TABLE month_dim

( month_sk INT NOT NULL AUTO_INCREMENT PRIMARY KEY

, month_name CHAR (9)

, month INT (2)

, quarter INT (1)

, year INT (4)

, effective_date DATE

, expiry_date DATE )

;

 

INSERT INTO month_dim

SELECT DISTINCT

  NULL

, month_name

, month

, quarter

, year

, effective_date

, expiry_date

FROM date_dim

;

 

/* end of script                                                */

 

    列表12-1中的脚本产生了month_dim表并向month_dim表插入不重复的月份数据,这些数据包含了从2005-03-012010-12-31这段时期的月份数据。当你通过运行列表12-1中的脚本装载month_dim表后,该表将有70个月份(从2005-03-012010-12-31)。

    用如下方式运行该脚本:

mysql> \. c:\mysql\scripts\month_rollup_dim.sql

    你将在你的控制台上看到:

Database changed

Query OK, 0 rows affected (0.14 sec)

 

Query OK, 70 rows affected (0.07 sec)

Records: 70  Duplicates: 0  Warnings: 0

 

mysql>

    现在查询month_dim表以确保装载正确:

mysql> select month_sk msk, month_name, month, quarter q, year,

    -> effective_date efdate, expiry_date exdate

-> from month_dim;

查询结果是:

+------+-------------+--------+----+--------+------------+------------+                                                                 -+

| msk  |  month_name |  month | q  |  year  | efdate     | exdate     |

+------+-------------+--------+----+--------+------------+------------+

|   1  |  March      |      3 |  1 |  2005  | 0000-00-00 | 9999-12-31 |

|   2  |  April      |      4 |  2 |  2005  | 0000-00-00 | 9999-12-31 |

|   3  |  May        |      5 |  2 |  2005  | 0000-00-00 | 9999-12-31 |

|   4  |  June       |      6 |  2 |  2005  | 0000-00-00 | 9999-12-31 |

|   6  |  August     |      8 |  3 |  2005  | 0000-00-00 | 9999-12-31 |

|   5  |  July       |      7 |  3 |  2005  | 0000-00-00 | 9999-12-31 |

|   7  |  September  |      9 |  3 |  2005  | 0000-00-00 | 9999-12-31 |

|   9  |  November   |     11 |  4 |  2005  | 0000-00-00 | 9999-12-31 |

|   8  |  October    |     10 |  4 |  2005  | 0000-00-00 | 9999-12-31 |

|  10  |  December   |     12 |  4 |  2005  | 0000-00-00 | 9999-12-31 |

|  11  |  January    |      1 |  1 |  2006  | 0000-00-00 | 9999-12-31 |

|  12  |  February   |      2 |  1 |  2006  | 0000-00-00 | 9999-12-31 |

|  13  |  March      |      3 |  1 |  2006  | 0000-00-00 | 9999-12-31 |

|  14  |  April      |      4 |  2 |  2006  | 0000-00-00 | 9999-12-31 |

|  15  |  May        |      5 |  2 |  2006  | 0000-00-00 | 9999-12-31 |

|  16  |  June       |      6 |  2 |  2006  | 0000-00-00 | 999 -12-31 |

|  17  |  July       |      7 |  3 |  2006  | 0000-00-00 | 9999-12-31 |

|  18  |  August     |      8 |  3 |  2006  | 0000-00-00 | 9999-12-31 |

|  19  |  September  |      9 |  3 |  2006  | 0000-00-00 | 9999-12-31 |

|  20  |  October    |     10 |  4 |  2006  | 0000-00-00 | 9999-12-31 |

|  21  |  November   |     11 |  4 |  2006  | 0000-00-00 | 9999-12-31 |

|  22  |  December   |     12 |  4 |  2006  | 0000-00-00 | 9999-12-31 |

|  23  |  January    |      1 |  1 |  2007  | 0000-00-00 | 9999-12-31 |

|  24  |  February   |      2 |  1 |  2007  | 0000-00-00 | 9999-12-31 |

|  26  |  April      |      4 |  2 |  2007  | 0000-00-00 | 9999-12-31 |

|  25  |  March      |      3 |  1 |  2007  | 0000-00-00 | 9999-12-31 |

|  27  |  May        |      5 |  2 |  2007  | 0000-00-00 | 9999-12-31 |

|  28  |  June       |      6 |  2 |  2007  | 0000-00-00 | 9999-12-31 |

|  29  |  July       |      7 |  3 |  2007  | 0000-00-00 | 9999-12-31 |

|  30  |  August     |      8 |  3 |  2007  | 0000-00-00 | 9999-12-31 |

|  31  |  September  |      9 |  3 |  2007  | 0000-00-00 | 9999-12-31 |

|  32  |  October    |     10 |  4 |  2007  | 0000-00-00 | 9999-12-31 |

|  33  |  November   |     11 |  4 |  2007  | 0000-00-00 | 9999-12-31 |

|  34  |  December   |     12 |  4 |  2007  | 0000-00-00 | 9999-12-31 |

|  35  |  January    |      1 |  1 |  2008  | 0000-00-00 | 9999-12-31 |

|  36  |  February   |      2 |  1 |  2008  | 0000-00-00 | 9999-12-31 |

|  37  |  March      |      3 |  1 |  2008  | 0000-00-00 | 9999-12-31 |

|  38  |  April      |      4 |  2 |  2008  | 0000-00-00 | 9999-12-31 |

|  39  |  May        |      5 |  2 |  2008  | 0000-00-00 | 9999-12-31 |

|  40  |  June       |      6 |  2 |  2008  | 0000-00-00 | 9999-12-31 |

|  41  |  July       |      7 |  3 |  2008  | 0000-00-00 | 9999-12-31 |

|  42  |  August     |      8 |  3 |  2008  | 0000-00-00 | 9999-12-31 |

|  43  |  September  |      9 |  3 |  2008  | 0000-00-00 | 9999-12-31 |

|  44  |  October    |     10 |  4 |  2008  | 0000-00-00 | 9999-12-31 |

|  45  |  November   |     11 |  4 |  2008  | 0000-00-00 | 9999-12-31 |

|  46  |  December   |     12 |  4 |  2008  | 0000-00-00 | 9999-12-31 |

|  47  |  January    |      1 |  1 |  2009  | 0000-00-00 | 9999-12-31 |

|  48  |  February   |      2 |  1 |  2009  | 0000-00-00 | 9999-12-31 |

|  49  |  March      |      3 |  1 |  2009  | 0000-00-00 | 9999-12-31 |

|  50  |  April      |      4 |  2 |  2009  | 0000-00-00 | 9999-12-31 |

|  51  |  May        |      5 |  2 |  2009  | 0000-00-00 | 9999-12-31 |

|  52  |  June       |      6 |  2 |  2009  | 0000-00-00 | 9999-12-31 |

|  53  |  July       |      7 |  3 |  2009  | 0000-00-00 | 9999-12-31 |

|  54  |  August     |      8 |  3 |  2009  | 0000-00-00 | 9999-12-31 |

|  55  |  September  |      9 |  3 |  2009  | 0000-00-00 | 9999-12-31 |

|  56  |  October    |     10 |  4 |  2009  | 0000-00-00 | 9999-12-31 |

|  57  |  November   |     11 |  4 |  2009  | 0000-00-00 | 9999-12-31 |

|  58  |  December   |     12 |  4 |  2009  | 0000-00-00 | 9999-12-31 |

|  59  |  January    |      1 |  1 |  2010  | 0000-00-00 | 9999-12-31 |

|  60  |  February   |      2 |  1 |  2010  | 0000-00-00 | 9999-12-31 |

|  61  |  March      |      3 |  1 |  2010  | 0000-00-00 | 9999-12-31 |

|  62  |  April      |      4    2 |  2010  | 0000-00-00 | 9999-12-31 |

|  63  |  May        |      5 |  2 |  2010  | 0000-00-00 | 9999-12-31 |

|  64  |  June       |      6 |  2 |  2010  | 0000-00-00 | 9999-12-31 |

|  65  |  July       |      7 |  3 |  2010  | 0000-00-00 | 9999-12-31 |

|  66  |  August     |      8 |  3 |  2010  | 0000-00-00 | 9999-12-31 |

|  67  |  September  |      9 |  3 |  2010  | 0000-00-00 | 9999-12-31 |

|  68  |  October    |     10 |  4 |  2010  | 0000-00-00 | 9999-12-31 |

|  69  |  November   |     11 |  4 |  2010  | 0000-00-00 | 9999-12-31 |

|  70  |  December   |     12 |  4 |  2010  | 0000-00-00 | 9999-12-31 |

+------+-------------+--------+----+--------+------------+-----------70 rows in set (0.00 sec)   

    为了能够定期的从日期维载入数据到月份维,你可以插入它的装载脚本到日期维度的装载脚本中。你需要更新之前在第6章讨论过的日期维装载的存储过程。修改后的存储过程如列表12-2所示。修改的地方用粗体表示。现在,只要在装载一个新的日期条目并且该日期的月份没有在月份维表中的时候,该修改后的脚本将能够装载月份向上钻取维表。

 

列表 12-2:修正后的日期预装载脚本

/*****************************************************************/

/*                                                               */

/* pre_populate_date_12.sql                                      */

/*                                                               */

/*****************************************************************/

 

USE dw;

 

DELIMITER // ;

 

DROP PROCEDURE IF EXISTS pre_populate_date //

 

CREATE PROCEDURE pre_populate_date (IN start_dt DATE, IN end_dt

       DATE)

BEGIN

       WHILE start_dt <= end_dt DO

              INSERT INTO date_dim(

                date_sk

              , date

              , month_name

              , month

              , quarter

              , year

              , effective_date

              , expiry_date

              )

              VALUES(

                NULL

              , start_dt

              , MONTHNAME (start_dt)

              , MONTH (start_dt)

              , QUARTER (start_dt)

              , YEAR (start_dt)

              , '0000-00-00'

              , '9999-12-31'

       )

              ;

              SET start_dt = ADDDATE (start_dt, 1);

       END WHILE;

 

INSERT INTO month_dim

SELECT DISTINCT

  NULL

, month_name

, month

, quarter

, year

, effective_date

, expiry_date

FROM date_dim

WHERE CONCAT (month, year) NOT IN

(SELECT CONCAT (month, year) FROM month_dim)

;

 

END

//

 

DELIMITER ; //

 

/* end of script                                                  */

 

用如下命令调用列表12-2所示的脚本来重新编译该存储过程:

mysql> \. c:\mysql\scripts\pre_populate_date_12.sql

你将在你的控制台上看到如下的响应信息:

Database changed

 

Query OK, 0 rows affected (0.22 sec)

Query OK, 0 rows affected (0.04 sec)

 

为了测试该修正后的预装载日期机制,运行该存储过程来增加从2011-01-01 2011-12-31期间的日期,用如下的命令方式:

mysql> call pre_populate_date ('2011-01-01', '2011-12-31');

 

Mysql将显示有12个记录生效。

Query OK, 12 rows affected (23.07 sec)

为了确认12个月份数据被正确载入,用该语句查询month_dim表:

mysql> select * from month_dim where year = 2011 \G

下面是查询的结果:

*************************** 1. row ***************************

      month_sk: 71

    month_name: January

         month: 1

       quarter: 1

          year: 2011

effective_date: 0000-00-00

   expiry_date: 9999-12-31

*************************** 2 row ***************************

      month_sk: 72

    month_name: February

         month: 2

       quarter: 1

          year: 2011

effective_date: 0000-00-00

   expiry_date: 9999-12-31

*************************** 3 row ***************************

      month_sk: 73

    month_name: March

         month: 3

       quarter: 1

          year: 2011

effective_date: 0000-00-00

   expiry_date: 9999-12-31

*************************** 4. row ***************************

      month_sk: 74

    month_name: April

         month: 4

       quarter: 2

          year: 2011

effective_date: 0000-00-00

   expiry_date: 9999-12-31

*************************** 5 row ***************************

      month_sk: 75

    month_name: May

         month: 5

       quarter: 2

          year: 2011

effective_date: 0000-00-00

   expiry_date: 9999-12-31

*************************** 6. row ***************************

      month_sk: 76

    month_name: June

         month: 6

       quarter: 2

          year: 2011

effective date: 0000-00-00

   expiry_date: 9999-12-31

*************************** 7. row ***************************

      month_sk: 77

    month_name: July

         month: 7

       quarter: 3

          year: 2011

effective_date: 0000-00-00

   expiry_date: 9999-12-31

*************************** 8. row ***************************

      month_sk: 78

    month_name: August

         month: 8

       quarter: 3

          year: 2011

effective_date: 0000-00-00

   expiry_date: 9999-12-31

*************************** 9 row ***************************

      month_sk: 79

    month_name: September

         month: 9

       quarter: 3

          year: 2011

effective_date: 0000-00-00

   expiry_date: 9999-12-31

*************************** 10. row ***************************

      month_sk: 80

    month_name: October

         month: 10

       quarter: 4

          year: 2011

effective_date: 0000-00-00

   expiry_date: 9999-12-31

*************************** 11. row ***************************

      month_sk: 81

    month_name: November

         month: 11

       quarter: 4

          year: 2011

effective_date: 0000-00-00

   expiry_date: 9999-12-31

*************************** 12. row ***************************

      month_sk: 82

    month_name: December

         month: 12

       quarter: 4

          year: 2011

effective_date: 0000-00-00

   expiry_date: 9999-12-31

12 rows in set (0.00 sec)

 

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