为我的BigQuery表选择3列作为键

时间:2019-07-05 13:11:04

标签: sql google-bigquery

我正在从BigQuery中的多个其他表创建一个表。这是一个复杂的查询。我想使用其中的3列作为我的钥匙。 BigQuery最好的方法是什么?我仍然是新手。

据我了解,BigQuery中没有主键。所有的列都是st。

3 个答案:

答案 0 :(得分:0)

您可以在这里使用CONCAT创建可以唯一标识记录的组合键:

请参见以下玩具示例

Select 
CONCAT(CAST(v1.numbers as String),v2.fruits,CAST(v3.bools as String)) as key
, v1.numbers
, v2.fruits
, v3.bools
from (SELECT  numbers from unnest([1, 2, 3]) as numbers) v1,
     (Select fruits from unnest(["apple", "pear", "orange"]) as fruits) as v2,
     (SELECT bools from unnest([true, false, true]) as bools)  as v3

答案 1 :(得分:0)

我建议您在原始问题中弄清楚GROUP BY person的含义,以帮助我们提供更好的答案(描述此密钥的用例会特别有帮助)。

如果您希望这些列创建某种独特的约束,则BigQuery当前不提供此选项-您需要在应用程序逻辑中处理该约束(或编写查询以使用分组或分析函数仅提取具有重复项的行的单个副本。

如果要在多个列上进行联接,则可以在keyON中使用多个条件:

USING

SELECT *
FROM
  t1
  INNER JOIN
  t2
  USING(col1,col2,col3)

如果联接表已经使用了此复合键,则只需在SELECT * FROM t1 INNER JOIN t2 ON t2.col1 = t1.col_1 --note, unlike USING, these names don't have to match AND t2.col2 = t1.col_2 AND t2.col3 = t1.col_3 中使用CONCAT

JOIN

如果您希望使用此键进行分组,则可以类似地在SELECT * FROM t1 INNER JOIN t2 ON t2.key = CONCAT(t1.col1,t1.col2,t1.col3) 中包括多个列:

GROUP BY

在我能想到的大多数其他情况下,仅使用-- sample data WITH t1 AS (SELECT * FROM UNNEST([ STRUCT("foo1" AS col1,"bar" AS col2,"baz" AS col3,1 AS val), STRUCT("foo1" AS col1,"bar" AS col2,"baz" AS col3,2 AS val), STRUCT("foo2" AS col1,"bar" AS col2,"baz" AS col3,3 AS val) ])) SELECT col1,col2,col3,SUM(val) AS total FROM t1 GROUP BY col1,col2,col3 应该可以。

答案 2 :(得分:0)

以下是用于BigQuery标准SQL

当我需要在几列中介绍一种键时,通常使用TO_JSON_STRING()函数而不是CONCAT()

至少有几个原因:

  1. 要使用CONCAT,首先需要将所有涉及的列CAST设置为STRING,而TO_JSON_STRING则不需要
  2. 简单的CONCAT在边缘情况下并不能真正产生正确的密钥-例如,对于下面两个不同的行-CONCAT将产生相同的密钥-1123,而TO_JSON_STRING将产生两个不同的密钥:{{1 }}和{"x":"11","y":"2","z":"3"}

    选择'11'x,'2'y,'3'z UNION ALL
    选择'1','12','3'