我使用JOIN将导入和导出数据中的国家/地区和产品ID替换为存储在单独表格中的实际国家/地区和产品名称。在数据源表( data )中,有两列具有国家/地区ID,原点和目的地,我将用国家/地区名称替换它们。
我提出的代码两次引用 country_names 表 - country_names 和 country_names2 , - 似乎没有非常优雅。我希望能够通过一个名称引用该表一次。如果有人向我指出一种更优雅,也许更有效的方法来获得相同的结果,我将不胜感激。
SELECT
country_names.name AS origin,
country_names2.name AS dest,
product_names.name AS product,
SUM(data.export_val) AS export_val,
SUM(data.import_val) AS import_val
FROM
OEC.year_origin_destination_hs92_6 AS data
JOIN
OEC.products_hs_92 AS product_names
ON
data.hs92 = product_names.hs92
JOIN
OEC.country_names AS country_names
ON
data.origin = country_names.id_3char
JOIN
OEC.country_names AS country_names2
ON
data.dest = country_names2.id_3char
WHERE
data.year > 2012
AND data.export_val > 1E8
GROUP BY
origin,
dest,
product
将产品ID转换为产品名称的表格有6K +行。这是一个小样本:
id hs92 name
63215 3215 Ink
2130110 130110 Lac
21002 1002 Rye
2100200 100200 Rye
52706 2706 Tar
20902 902 Tea
42203 2203 Beer
42302 2302 Bran
178703 8703 Cars
将国家/地区ID转换为国家/地区名称的表格(我必须两次加入的表格)对于世界上所有国家/地区都有264行。 ( id_3char 是使用的列。)以下是一个示例:
id id_3char name
euchi chi Channel Islands
askhm khm Cambodia
eublx blx Belgium-Luxembourg
eublr blr Belarus
eumne mne Montenegro
euhun hun Hungary
asmng mng Mongolia
nabhs bhs Bahamas
afsen sen Senegal
以下是导入和导出数据表中的数据示例,总共有205M行,其中包含两列 origin 和 dest 加入:
year origin dest hs92 export_val import_val
2009 can isr 300410 2152838.47 3199.24
1995 chn jpn 590190 275748.65 554154.24
2000 deu gmb 100610 1573508.44 1327.0
2008 deu jpn 540822 10000.0 202062.43
2010 deu ukr 950390 1626012.04 159423.38
2006 esp prt 080530 2470699.19 125291.33
2006 grc ind 844859 8667.0 3182.0
2000 ltu deu 630399 6018.12 5061.96
2005 usa zaf 290219 2126216.52 34561.61
1997 ven ecu 281122 155347.73 1010.0
答案 0 :(得分:3)
我认为你已经完成了这样做,它可以被认为是足够好的,只是按原样使用:o)
同时,如果由于某种原因你really-really
想要避免在该国家/地区表上有两个联接 - 您可以做的是在下面的select语句中实现,让我们说'OEC.origin_destination_pairs`表
SELECT
o.id_3char o_id_3char,
o.name o_name,
d.id_3char d_id_3char,
d.name d_name
FROM `OEC.country_names` o
CROSS JOIN `OEC.country_names` d
然后您可以加入新表格,如下所示
SELECT
country_names.o_name AS origin,
country_names.d_name AS dest,
product_names.name AS product,
SUM(data.export_val) AS export_val,
SUM(data.import_val) AS import_val
FROM OEC.year_origin_destination_hs92_6 AS data
JOIN OEC.products_hs_92 AS product_names
ON data.hs92 = product_names.hs92
JOIN OEC.origin_destination_pairs AS country_names
ON data.origin = country_names.o_id_3char
AND data.dest = country_names2.d_id_3char
WHERE data.year > 2012
AND data.export_val > 1E8
GROUP BY
origin,
dest,
product
上面的动机是在你的特定情况下存储和查询的成本
您的`OEC.country_names`表大小约为10KB
每次查询时,您都需要支付10MB(费用四舍五入到最接近的MB,查询引用的每个表最少处理10 MB数据,每个查询最少处理10 MB数据。)
所以,如果你将实现上述表格 - 它仍然不到10MB,所以查询费用没有区别
存储该表的类似情况 - 费用没有明显变化
您可以查看有关定价here