Bigquery:新专栏

时间:2018-03-20 18:31:43

标签: sql google-bigquery

我有以下表结构

+----+-------------+------------+
| id | transaction |    time    |
+----+-------------+------------+
|  1 |          10 | 01.01.2018 |
|  1 |          20 | 10.01.2018 |
|  2 |          20 | 05.01.2018 |
|  2 |          30 | 15.01.2018 |
|  2 |           5 | 03.02.2018 |
+----+-------------+------------+

我现在要做的是计算每个id的事务总和。但是,我想分别用一个滚动的金额来表示每个月份的时间。所以我想以类似的结尾:

+----+-------+-------+
| id | sum_1 | sum_2 |
+----+-------+-------+
|  1 |    30 |    30 |
|  2 |    50 |    55 |
+----+-------+-------+

这意味着,我想每月分组时间,并计算到此时每个id的总和。所以它不像我假设的经典分区。当然我可以单独进行然后加入,但由于我有很多月度或每周分区,这可能不可行。也许有人有个主意。

1 个答案:

答案 0 :(得分:2)

以下是BigQuery Standard SQL的示例

   
native

结果为

#standardSQL
WITH `project.dataset.table` AS (
  SELECT 1 id, 10 transaction, '01.01.2018' time UNION ALL
  SELECT 1, 20, '10.01.2018' UNION ALL
  SELECT 2, 20, '05.01.2018' UNION ALL
  SELECT 2, 30, '15.01.2018' UNION ALL
  SELECT 2, 5, '03.02.2018' 
)
SELECT id, month, 
  SUM(transactions) OVER(PARTITION BY id ORDER BY month) rolling_transactions
FROM (
  SELECT id, 
    DATE_TRUNC(PARSE_DATE('%d.%m.%Y', time), MONTH) month,
    SUM(transaction) transactions
  FROM `project.dataset.table`
  GROUP BY id, month 
)
ORDER BY id, month

建议将结果展平至任意数月或数周或您需要的任何其他时间段,然后您可以进一步将结果转换为您的应用程序

注意:对于每周案例 - 只需在DATE_TRUNC

中将MONTH更改为WEEK