使用子查询连接两个数据集

时间:2015-07-06 21:59:52

标签: google-bigquery

我正在尝试使用BigQuery连接两个大型数据集。它们有一个公共字段,但是公共字段在每个数据集中都有不同的名称。

我想计算行数并将table1和table2的案例逻辑结果相加。

我认为由于子查询(subselect?)和语法错误而导致错误。我试图从类似的帖子申请先例,但我似乎仍然缺少一些东西。非常感谢任何有助于获得此分类的帮助。

SELECT
table1.field1,
table1.field2,
    (
    SELECT COUNT (*)
    FROM table1) AS table1_total,
sum(case when table1.mutually_exclusive_metric1 = "Y" then 1 else 0 end) AS t1_pass_1,
sum(case when table1.mutually_exclusive_metric1 = "Y" AND table1.mutually_exclusive_metric2 IS null OR table1.mutually_exclusive_metric3 = 'Y' then 1 else 0 end) AS t1_pass_2, 
sum(case when table1.mutually_exclusive_metric3 ="Y" AND table1.mutually_exclusive_metric2 ="Y" AND table1.mutually_exclusive_metric3 ="Y" then 1 else 0 end) AS  t1_pass_3,
    (
    SELECT COUNT (*)
    FROM table2) AS table2_total,
sum(case when table2.metric1 IS true then 1 else 0 end) AS t2_pass_1,
sum(case when table2.metric2 IS true then 1 else 0 end) AS t2_pass_2,
    (
        SELECT COUNT (*)
        FROM dataset1.table1 JOIN EACH dataset2.table2 ON common_field_table1 =  common_field_table2) AS overlap 
FROM
dataset1.table1,
dataset2.table2
WHERE
XYZ

提前致谢!

1 个答案:

答案 0 :(得分:1)

昭。让我们一步一步: 1)使用*不明确,明确是好的。另外,声明显式选择和*将使用自动名称重复选择。 table1.field将成为table1_field。除非你只是在玩,否则不要使用*。

2)你从未加入过。带连接的查询如下所示(注意WHERE和GROUP语句的顺序,注意每个语句的命名):

SELECT
  t1.field1 AS field1,
  t2.field2 AS field2
FROM dataset1.table1 AS t1

JOIN dataset2.table2 AS t2
ON t1.field1 = t2.field1

WHERE t1.field1 = "some value"

GROUP BY field1, field2

其中t1.f1 = t2.f1包含相应的值。你不会在选择中重复这些。

3)使用空格使代码更易于阅读。它可以帮助所有参与者,包括你。

4)你的子选择很没用。使用子选择而不是创建新表。例如,您可以使用子选择来对现有表中的数据进行分组或过滤。例如:

SELECT
  subselect.field1 AS ssf1,
  subselect.max_f1 AS ss_max_f1
FROM (
    SELECT
        t1.field1 AS field1,
        MAX(t1.field1) AS max_f1,
    FROM dataset1.table1 AS t1

    GROUP BY field1
) AS subselect

subselect实际上是一个你可以选择的新表。在逻辑上对待它,就像它首先发生一样,然后从中获取结果并在主选择中使用它。

5)这是一个可怕的问题。它甚至看起来不像你试图一步一步解决问题。