【问题标题】:BigQuery Standard SQL Pivot Rows to Columns [duplicate]BigQuery 标准 SQL 将行数据透视到列 [重复]
【发布时间】:2019-03-08 13:48:07
【问题描述】:

我正在尝试使用 BigQuery 中的标准 SQL 查询使用行来存储时间序列数据的数据。下面的示例数据。会有比 A-D 更多的工作

+-----+------------+--------------+-----------+
| Job | BatchDate  | SuccessCount | FailCount |
+-----+------------+--------------+-----------+
| A   | 2018-01-01 |           35 |         1 |
| A   | 2018-01-07 |           13 |         6 |
| B   | 2018-01-01 |           12 |        23 |
| B   | 2018-01-07 |           67 |        12 |
| C   | 2018-01-01 |            9 |         4 |
| C   | 2018-01-07 |           78 |         6 |
| D   | 2018-01-01 |            3 |        78 |
| D   | 2018-01-07 |           99 |         5 |
+-----+------------+--------------+-----------+

我希望将以下内容作为输出,但不知道如何在 BigQuery 中完成此操作。

列中的 SuccessCount 值

+-----+------------+--------------+
| Job | 2018-01-01 | 2018-01-07   |
+-----+------------+--------------+
| A   |         35 |           13 |
| B   |         12 |           67 |
| C   |          9 |           78 |
| D   |          3 |           99 |
+-----+------------+--------------+

BigQuery 可以实现这种功能吗?谁能提供一个可行的例子?

谢谢

编辑

数据会随着时间的推移而增长,每周每项工作都会有新条目。有没有办法做到这一点,而不必将每个 BatchDate 硬编码为一列?

【问题讨论】:

  • 如果你的数据真的有 8 行,其中 4 行没有Job,那么这个是做不到的。 SQL 表表示 无序 集,因此无法确定缺失行上的 Job

标签: sql google-bigquery


【解决方案1】:

用例当

    select Job,
   sum(case when batchdate='2018-01-01' then SuccessCount else 0 end) as s_01
    sum(case when batchdate = '2018-01-07' then SuccessCount else 0 end) as s_07
   from t group by job

【讨论】:

  • 寻找一种解决方案,让我尽可能不使用硬编码列
【解决方案2】:

如果 Job 在所有行上都可用,则条件聚合可以满足您的要求:

select job,
       sum(case when batchdate = '2018-01-01' then SuccessCount else 0 end) as success_20180101,
       sum(case when batchdate = '2018-01-07' then SuccessCount else 0 end) as success_20180107
from t
group by job
order by job;

【讨论】:

  • 寻找一种解决方案,让我尽可能不使用硬编码列
猜你喜欢
  • 2016-06-18
  • 2022-01-07
  • 2019-04-12
  • 2017-04-07
  • 2016-05-12
  • 2018-01-08
  • 2016-04-15
  • 2013-01-28
  • 1970-01-01
相关资源
最近更新 更多