(五)进阶技术 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所示。
代码语言:javascript复制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
图(五)- 6-1
分组查询的输出显示了每一行的度量(销售订单金额)都沿着年-季度-月的层次分组。 Kettle转换用于分组查询的步骤如图(五)- 6-2到图(五)- 6-7所示。
图(五)- 6-2
图(五)- 6-3
图(五)- 6-4
图(五)- 6-5
图(五)- 6-6
图(五)- 6-7
执行结果如图(五)- 6-8所示,和图(五)- 6-1的查询结果相同。
图(五)- 6-8
与分组查询类似,钻取查询也把度量按照一个维度的一个或多个级别进行分组。但与分组查询不同的是,分组查询只显示分组后最低级别(月级别)上的度量(订单金额的汇总),而钻取查询显示分组后维度每一个级别的度量。清单(五)- 6-2里的钻取查询显示了每个日期维度级别(年、季度和月级别)的订单汇总金额。
代码语言:javascript复制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所示。
图(五)- 6-9
图(五)- 6-10
图(五)- 6-11
图(五)- 6-12
图(五)- 6-13
图(五)- 6-14
图(五)- 6-15
图(五)- 6-16
图(五)- 6-17
图(五)- 6-18
图(五)- 6-19
图(五)- 6-20
图(五)- 6-21
图(五)- 6-22
图(五)- 6-23
图(五)- 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 | ------------------ ----------- --------------