如何在 BigQuery 中按外键分组?
Posted
技术标签:
【中文标题】如何在 BigQuery 中按外键分组?【英文标题】:How to GROUP BY a foreign key in BigQuery? 【发布时间】:2016-01-15 11:38:20 【问题描述】:我在 BigQuery 中工作。我有三个表:分支、区域(分支的集合)和按月按分支的支出。
CREATE TABLE region (
id integer NOT NULL,
name varchar NOT NULL
);
CREATE TABLE branch (
id integer NOT NULL,
name varchar NOT NULL,
region integer NOT NULL
);
CREATE TABLE spend (
branch integer NOT NULL
amount float,
month timestamp,
item_code int
);
我怎样才能得到按月按地区的总支出?
我有这个按月按分行的总支出:
SELECT branch,
month,
SUM(amount) AS total_amount
FROM [mytable]
GROUP BY branch,
month
但我不知道如何按地区分组。我想我需要一个IN
子句?
这也是一个相当大的数据集(spend
表中的 150GB/500m 行),因此大型 JOIN 可能无法工作。
【问题讨论】:
你说你有 3 张桌子,但你从 4:th 中选择... 对不起,应该是FROM spend
——只是BQ语法略有不同(FROM [mydataset.spend]
)。
不管怎样,BQ 擅长连接,尤其是在大表和小/中型表之间(但即使大/大也可以正常工作)。我只是试一试!
【参考方案1】:
大概,你想要一个连接和聚合,我很确定 Bigquery 支持:
SELECT b.region, s.month, SUM(s.amount) AS total_amount
FROM spend s join
branch b
ON s.branch = b.id
GROUP BY b.region, s.month;
【讨论】:
【参考方案2】:SELECT r.name as region, [month], SUM(total_amount) AS total_amount
FROM (
SELECT branch, [month], SUM(amount) AS total_amount
FROM [mydataset.spend]
GROUP EACH BY branch, [month]
) AS s
JOIN [mydataset.branch] AS b ON s.branch = b.id
JOIN [mydataset.region] AS r ON b.region = r.id
GROUP BY 1, 2
GROUP EACH BY 和子选择中的预分组在这里用于解决您的问题:large JOINs may not work
。
【讨论】:
以上是关于如何在 BigQuery 中按外键分组?的主要内容,如果未能解决你的问题,请参考以下文章