在 BigQuery SQL 中转换数据?
Pivot data in BigQuery SQL?
我正在使用 BigQuery。我有两个 tables:
organisations:
org_code STRING
name STRING
spending:
org STRING
month DATE
quantity INTEGER
code STRING
然后通过相当复杂的查询来获取每个组织的结果,按月计算:
SELECT
organisations.org_code AS org,
num.month AS month,
(num.quantity / denom.quantity) AS ratio_quantity
FROM (
SELECT
org_code, name
FROM
[mytable.organisations]) AS organisations
LEFT OUTER JOIN EACH (
SELECT
org,
month,
SUM(quantity) AS quantity
FROM
[mytable.spending]
GROUP BY
org,
month) AS denom
ON
denom.org = organisations.org_code
LEFT OUTER JOIN EACH (
SELECT
org,
month,
SUM(quantity) AS quantity
FROM
[hscic.spending]
WHERE
code LIKE 'XXXX%'
GROUP BY
org,
month) AS num
ON
denom.month = num.month
AND denom.org = num.org
ORDER BY org, month
我的最终结果如下所示,每个 org/month 组合一行:
org,month,ratio_quantity
A81001,2015-10-01 00:00:00 UTC,28
A82001,2015-11-01 00:00:00 UTC,43
A82002,2015-10-01 00:00:00 UTC,16
现在我想将结果转换为如下所示,每月一行,每个组织一列:
month,items.A81001,items.A82002...
2015-10-01 00:00:00 UTC,28,16
2015-11-01 00:00:00 UTC,43,...
这在同一个 BigQuery 调用中是否可行?或者我应该创建一个新的 table 并从那里转向它?还是我应该在 Python 中进行整形?
更新:大约有 500,000 个结果,仅供参考。
Q. Is this possible in the same BigQuery call? Or should I create a new
table and pivot it from there?
通常,您可以将该“复杂查询”用作子查询,以便将额外逻辑应用于当前结果。
所以,这绝对是可行的。但是代码很快就会变得难以管理或难以管理——因此您可以考虑将此结果写入新的 table,然后从那里转向它
如果您坚持执行数据透视的方向(您在问题中描述的方式)- 请查看下方 link 以查看有关如何在 BigQuery 中实现数据透视的详细介绍。
请注意 – 每个 table 有 10K 列的限制 - 因此您只能使用 10K 个组织。
您还可以看到下面的简化示例(如果上面的例子也是 complex/verbose):
How to create dummy variable columns for thousands of categories in Google BigQuery?
Q. Or should I just do the reshaping in Python?
如果以上内容对您不起作用 – 始终以客户端为中心是一种选择,但现在您应该考虑客户端的限制
希望对您有所帮助!
我正在使用 BigQuery。我有两个 tables:
organisations:
org_code STRING
name STRING
spending:
org STRING
month DATE
quantity INTEGER
code STRING
然后通过相当复杂的查询来获取每个组织的结果,按月计算:
SELECT
organisations.org_code AS org,
num.month AS month,
(num.quantity / denom.quantity) AS ratio_quantity
FROM (
SELECT
org_code, name
FROM
[mytable.organisations]) AS organisations
LEFT OUTER JOIN EACH (
SELECT
org,
month,
SUM(quantity) AS quantity
FROM
[mytable.spending]
GROUP BY
org,
month) AS denom
ON
denom.org = organisations.org_code
LEFT OUTER JOIN EACH (
SELECT
org,
month,
SUM(quantity) AS quantity
FROM
[hscic.spending]
WHERE
code LIKE 'XXXX%'
GROUP BY
org,
month) AS num
ON
denom.month = num.month
AND denom.org = num.org
ORDER BY org, month
我的最终结果如下所示,每个 org/month 组合一行:
org,month,ratio_quantity
A81001,2015-10-01 00:00:00 UTC,28
A82001,2015-11-01 00:00:00 UTC,43
A82002,2015-10-01 00:00:00 UTC,16
现在我想将结果转换为如下所示,每月一行,每个组织一列:
month,items.A81001,items.A82002...
2015-10-01 00:00:00 UTC,28,16
2015-11-01 00:00:00 UTC,43,...
这在同一个 BigQuery 调用中是否可行?或者我应该创建一个新的 table 并从那里转向它?还是我应该在 Python 中进行整形?
更新:大约有 500,000 个结果,仅供参考。
Q. Is this possible in the same BigQuery call? Or should I create a new table and pivot it from there?
通常,您可以将该“复杂查询”用作子查询,以便将额外逻辑应用于当前结果。 所以,这绝对是可行的。但是代码很快就会变得难以管理或难以管理——因此您可以考虑将此结果写入新的 table,然后从那里转向它
如果您坚持执行数据透视的方向(您在问题中描述的方式)- 请查看下方 link 以查看有关如何在 BigQuery 中实现数据透视的详细介绍。
请注意 – 每个 table 有 10K 列的限制 - 因此您只能使用 10K 个组织。
您还可以看到下面的简化示例(如果上面的例子也是 complex/verbose):
How to create dummy variable columns for thousands of categories in Google BigQuery?
Q. Or should I just do the reshaping in Python?
如果以上内容对您不起作用 – 始终以客户端为中心是一种选择,但现在您应该考虑客户端的限制
希望对您有所帮助!