在 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?

如果以上内容对您不起作用 – 始终以客户端为中心是一种选择,但现在您应该考虑客户端的限制

希望对您有所帮助!