(五)进阶技术


        6. 维度层次


        大多数维度都具有一个或多个层次。例如,日期维度就有一个四级层次:年、季度、月和日。这些级别用date_dim表里的列来表示。日期维度是一个单路径层次,因为除了年-季度-月-日这条路径外,它没有任何其它层次。本篇将讨论在维度的层次上进行分组和钻取查询。多路径层次在下一篇“多路径和参差不齐的层次”中讨论。



        为了识别数据仓库里一个维度的层次,首先要理解维度中列的含义。然后就可以识别两个或多个列具有相同的主题。例如,日、月、季度和年具有相同的主题因为它们都是关于日历的。具有相同主题的列形成一个组。组中的一列必须包含至少一个组内的其它成员。例如,在前面提到的组中,月包含日。这些列的链条形成了一个层次。例如,日-月-季度-年这个链条是一个日期维度的层次。除了日期维度,产品和客户维度也有层次。



表(五)- 6-1显示了三个维度的层次。注意客户维度具有两个路径的层次。


customer_dim

ptoduct_dim

date_dim

customer_street_address

shipping_address

product_name

date

customer_zip_code

shipping_zip_code

product_category

month_name

customer_city

shipping_city

 

quarter

customer_state

shipping_state

 

year

表(五)- 6-1



        分组和钻取查询


        可以在层次上进行分组和钻取查询。分组查询是把度量按照一个维度的一个或多个级别进行分组。清单(五)- 6-1里的脚本是一个分组查询的例子。这个查询按产品(product_category列)和日期维度的三个层次级别(year、quarter和month_name列)分组返回销售金额。查询结果如图(五)- 6-1所示。


USE dw;

SELECT 
    product_category,
    year,
    quarter,
    month_name,
    SUM(order_amount)
FROM
    sales_order_fact a,
    product_dim b,
    date_dim c
WHERE
    a.product_sk = b.product_sk
        AND a.order_date_sk = c.date_sk
GROUP BY product_category , year , quarter , month
ORDER BY product_category , year , quarter , month;


清单(五)- 6-1




数据仓库分层4层模型定义 数据仓库层次模型_Storage



图(五)- 6-1



        分组查询的输出显示了每一行的度量(销售订单金额)都沿着年-季度-月的层次分组。



        Kettle转换用于分组查询的步骤如图(五)- 6-2到图(五)- 6-7所示。



数据仓库分层4层模型定义 数据仓库层次模型_数据仓库分层4层模型定义_02



图(五)- 6-2



数据仓库分层4层模型定义 数据仓库层次模型_Storage_03



图(五)- 6-3



数据仓库分层4层模型定义 数据仓库层次模型_数据仓库分层4层模型定义_04



图(五)- 6-4



数据仓库分层4层模型定义 数据仓库层次模型_ci_05



图(五)- 6-5



数据仓库分层4层模型定义 数据仓库层次模型_数据仓库分层4层模型定义_06



图(五)- 6-6



数据仓库分层4层模型定义 数据仓库层次模型_ci_07



图(五)- 6-7



        执行结果如图(五)- 6-8所示,和图(五)- 6-1的查询结果相同。



数据仓库分层4层模型定义 数据仓库层次模型_ci_08


图(五)- 6-8



        与分组查询类似,钻取查询也把度量按照一个维度的一个或多个级别进行分组。但与分组查询不同的是,分组查询只显示分组后最低级别(月级别)上的度量(订单金额的汇总),而钻取查询显示分组后维度每一个级别的度量。清单(五)- 6-2里的钻取查询显示了每个日期维度级别(年、季度和月级别)的订单汇总金额。


USE dw;

SELECT 
    product_category, time, order_amount
FROM
    ((SELECT 
        product_category,
            min(date) date,
            year time,
            1 sequence,
            SUM(order_amount) order_amount
    FROM
        sales_order_fact a, product_dim b, date_dim c
    WHERE
        a.product_sk = b.product_sk
            AND a.order_date_sk = c.date_sk
    GROUP BY product_category , year) UNION ALL (SELECT 
        product_category,
            min(date) date,
            quarter time,
            2 sequence,
            SUM(order_amount)
    FROM
        sales_order_fact a, product_dim b, date_dim c
    WHERE
        a.product_sk = b.product_sk
            AND a.order_date_sk = c.date_sk
    GROUP BY product_category , year , quarter) UNION ALL (SELECT 
        product_category,
            min(date) date,
            month_name time,
            3 sequence,
            SUM(order_amount)
    FROM
        sales_order_fact a, product_dim b, date_dim c
    WHERE
        a.product_sk = b.product_sk
            AND a.order_date_sk = c.date_sk
    GROUP BY product_category , year , quarter , month_name)) x
ORDER BY product_category , date , sequence , time;


清单(五)- 6-2



        Kettle转换用于钻取查询的步骤如图(五)- 6-9到图(五)- 6-24所示。



数据仓库分层4层模型定义 数据仓库层次模型_Storage_09


图(五)- 6-9



数据仓库分层4层模型定义 数据仓库层次模型_ci_10



图(五)- 6-10



数据仓库分层4层模型定义 数据仓库层次模型_分组查询_11



图(五)- 6-11



数据仓库分层4层模型定义 数据仓库层次模型_Storage_12



图(五)- 6-12



数据仓库分层4层模型定义 数据仓库层次模型_数据仓库分层4层模型定义_13



图(五)- 6-13



数据仓库分层4层模型定义 数据仓库层次模型_分组查询_14



图(五)- 6-14



数据仓库分层4层模型定义 数据仓库层次模型_分组查询_15



图(五)- 6-15



数据仓库分层4层模型定义 数据仓库层次模型_ci_16



图(五)- 6-16



数据仓库分层4层模型定义 数据仓库层次模型_Storage_17



图(五)- 6-17



数据仓库分层4层模型定义 数据仓库层次模型_分组查询_18



图(五)- 6-18



数据仓库分层4层模型定义 数据仓库层次模型_数据仓库分层4层模型定义_19



图(五)- 6-19



数据仓库分层4层模型定义 数据仓库层次模型_ci_20



图(五)- 6-20



数据仓库分层4层模型定义 数据仓库层次模型_Storage_21



图(五)- 6-21



数据仓库分层4层模型定义 数据仓库层次模型_分组查询_22



图(五)- 6-22



数据仓库分层4层模型定义 数据仓库层次模型_数据仓库分层4层模型定义_23



图(五)- 6-23



数据仓库分层4层模型定义 数据仓库层次模型_ci_24



图(五)- 6-24



        Kettle执行结果与清单(五)- 6-2的查询相同,如下所示。

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

 | product_category | time      | order_amount | 

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

 | Monitor          | 2013      |     10000.00 | 

 | Monitor          | 1         |      4000.00 | 

 | Monitor          | March     |      4000.00 | 

 | Monitor          | 3         |      6000.00 | 

 | Monitor          | July      |      6000.00 | 

 | Monitor          | 2014      |      8500.00 | 

 | Monitor          | 1         |      1000.00 | 

 | Monitor          | January   |      1000.00 | 

 | Monitor          | 2         |      2500.00 | 

 | Monitor          | April     |      2500.00 | 

 | Monitor          | 3         |      4000.00 | 

 | Monitor          | July      |      4000.00 | 

 | Monitor          | 4         |      1000.00 | 

 | Monitor          | October   |      1000.00 | 

 | Monitor          | 2015      |     36000.00 | 

 | Monitor          | 1         |     36000.00 | 

 | Monitor          | February  |      4000.00 | 

 | Monitor          | March     |     32000.00 | 

 | Peripheral       | 2015      |     25000.00 | 

 | Peripheral       | 1         |     25000.00 | 

 | Peripheral       | March     |     25000.00 | 

 | Storage          | 2013      |     26000.00 | 

 | Storage          | 2         |     10000.00 | 

 | Storage          | April     |      4000.00 | 

 | Storage          | May       |      6000.00 | 

 | Storage          | 3         |      8000.00 | 

 | Storage          | September |      8000.00 | 

 | Storage          | 4         |      8000.00 | 

 | Storage          | November  |      8000.00 | 

 | Storage          | 2014      |     15000.00 | 

 | Storage          | 1         |      3000.00 | 

 | Storage          | February  |      1000.00 | 

 | Storage          | March     |      2000.00 | 

 | Storage          | 2         |      6500.00 | 

 | Storage          | May       |      3000.00 | 

 | Storage          | June      |      3500.00 | 

 | Storage          | 3         |      5500.00 | 

 | Storage          | August    |      4500.00 | 

 | Storage          | September |      1000.00 | 

 | Storage          | 2015      |     54000.00 | 

 | Storage          | 1         |     54000.00 | 

 | Storage          | January   |      4000.00 | 

 | Storage          | February  |      4000.00 | 

 | Storage          | March     |     46000.00 | 

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