我正在从BigQuery中的多个其他表创建一个表。这是一个复杂的查询。我想使用其中的3列作为我的钥匙。 BigQuery最好的方法是什么?我仍然是新手。
据我了解,BigQuery中没有主键。所有的列都是st。
答案 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当前不提供此选项-您需要在应用程序逻辑中处理该约束(或编写查询以使用分组或分析函数仅提取具有重复项的行的单个副本。
如果要在多个列上进行联接,则可以在key
或ON
中使用多个条件:
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()
至少有几个原因:
简单的CONCAT在边缘情况下并不能真正产生正确的密钥-例如,对于下面两个不同的行-CONCAT将产生相同的密钥-1123
,而TO_JSON_STRING将产生两个不同的密钥:{{1 }}和{"x":"11","y":"2","z":"3"}
选择'11'x,'2'y,'3'z UNION ALL
选择'1','12','3'