【问题标题】:fact table : colums with same data and different meaning事实表:具有相同数据和不同含义的列
【发布时间】:2013-06-14 01:07:01
【问题描述】:
我有包含外贸数据(货物进出口)的事实表,我有 2 列,分别命名为:coutryFrom 和 countryTo,coutryFrom 是货物运往的国家,countryTo 是目的地不错。
有时我需要知道每个国家/地区的出口总值以选择前 5 个目的地,有时我需要相同的结果,但要通过 coutryFrom 进口。
如您所知,预定义的国家/地区列表,例如法国、意大利、英国、美国……
我不知道我应该在事实表中添加这两个国家还是只添加国家并做一些事情来解决这个问题
谢谢
【问题讨论】:
标签:
database-design
data-warehouse
business-intelligence
【解决方案1】:
不要将国家名称直接添加到事实表中,而是使用DIM_COUNRTY_ID 代理键创建DIM_COUNTRY 维度表,并将代理键放入事实表上的COUNTRY_FROM_ID 和COUNTRY_TO_ID。然后,您可以在查询中为 DIM_COUNTRY 表添加别名,以便它可以连接到 COUNTRY_FROM_ID 和 COUNTRY_TO_ID。
前 5 个国家来自:
SELECT *
FROM
(
SELECT
RANK() OVER(ORDER BY F.AMOUNT) RANK
, CF.COUNTRY_NAME
, SUM(F.AMOUNT)
FROM
FACT_EXPORTS F
, DIM_COUNTRY CT
, DIM_COUNTRY CF
WHERE 0=0
AND F.COUNTRY_TO_ID = CT.DIM_COUNTRY_ID
AND F.COUNTRY_FROM_ID = CF.DIM_COUNTRY_ID
GROUP BY
CT.COUNTRY_NAME
)
WHERE
RANK <= 5
ORDER BY
RANK
;
前 5 个国家到:
SELECT *
FROM
(
SELECT
RANK() OVER(ORDER BY F.AMOUNT) RANK
, CT.COUNTRY_NAME
, SUM(F.AMOUNT)
FROM
FACT_EXPORTS F
, DIM_COUNTRY CT
, DIM_COUNTRY CF
WHERE 0=0
AND F.COUNTRY_TO_ID = CT.DIM_COUNTRY_ID
AND F.COUNTRY_FROM_ID = CF.DIM_COUNTRY_ID
GROUP BY
CT.COUNTRY_NAME
)
WHERE
RANK <= 5
ORDER BY
RANK
;
请注意,如果出现平局,这两个查询都将返回 5 条以上的记录。最后一个考虑因素是您是否希望为始发国和目的地国保留不同的描述性属性。然后你需要 2 个单独的维度 DIM_COUNTRY_FROM 和 DIM_COUNTRY_TO。无论哪种方式,您仍然会使用代理键,而不是将国家/地区名称放入事实表中。