BigQuery标准SQL数据透视表行到列

时间:2018-10-03 10:37:34

标签: sql google-bigquery

我正在尝试使用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中完成此操作。

列中的成功计数值

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

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

谢谢

修改

数据将随着时间的推移而增长,每周每项工作都有新条目。有没有一种方法可以不必将每个BatchDate硬编码为一列?

3 个答案:

答案 0 :(得分:1)

@Mikhail Berlyant为此提供了出色的解决方案,请参见下面的链接。

Dynamic columns from row data

答案 1 :(得分:0)

如果GET /_search { "_source": [ "fullName" ], "stored_fields": [ "fullName.terms" ], "query": { "bool": { "must": { "script": { "script": { "source": "doc['fullName.terms'].value != 3", "lang": "painless" } } } } } } 在所有行上均可用,那么条件聚合将满足您的要求:

Job

答案 2 :(得分:0)

用例

    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