在两列

时间:2018-02-10 13:40:53

标签: sql join google-bigquery

我使用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

1 个答案:

答案 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

的更多信息