我有一个事实表,其中包含有关外贸(货物的进口/出口)的数据,我有两列,名为: coutryFrom和countryTo,coutryFrom是货物的来源国,countryTo是货物的目的地。
有些时候,我需要知道每个countryTo的出口总值,以选择前5个目的地,有时我将需要相同的结果,但由coutryFrom进口。
如您所知的国家/地区列表,为ex FR法国,IT意大利,英国,美国,...
我不知道我是应该在事实表中添加这两个国家,还是只添加国家并做一些事情来解决这个问题
谢谢
发布于 2013-06-15 01:34:05
不要将国家名称直接添加到事实表中,而是使用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条以上的记录。最后一个要考虑的问题是,您是否希望为发起国和目的地国家维护不同的描述性属性。那么你需要两个不同的维度DIM_COUNTRY_FROM和DIM_COUNTRY_TO。无论哪种方式,您仍将使用代理键,而不是将国家名称放入事实数据表中。
https://stackoverflow.com/questions/17099624
复制相似问题