我有包含外贸数据(货物进出口)的事实表,我有 2 列,分别命名为:coutryFrom 和 countryTo,coutryFrom 是货物运往的国家,countryTo 是货物的目的地。
有时我需要知道每个国家的出口总值以选择前 5 个目的地,有时我需要相同的结果,但要通过 coutryFrom 进口。
如您所知,预定义的国家/地区列表,例如法国、意大利、英国、美国……
我不知道我是应该在事实表中添加这两个国家还是只添加国家并做一些事情来解决这个问题
谢谢
我有包含外贸数据(货物进出口)的事实表,我有 2 列,分别命名为:coutryFrom 和 countryTo,coutryFrom 是货物运往的国家,countryTo 是货物的目的地。
有时我需要知道每个国家的出口总值以选择前 5 个目的地,有时我需要相同的结果,但要通过 coutryFrom 进口。
如您所知,预定义的国家/地区列表,例如法国、意大利、英国、美国……
我不知道我是应该在事实表中添加这两个国家还是只添加国家并做一些事情来解决这个问题
谢谢
不要将国家名称直接添加到事实表中,而是使用代理键制作DIM_COUNTRY
维度表,并将DIM_COUNRTY_ID
代理键放入事实表中。然后,您可以在查询中为该表设置别名,以便它可以连接到和。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。无论哪种方式,您仍然会使用代理键而不是将国家/地区名称放入事实表中。