我有以下表结构
+----+-------------+------------+
| 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的总和。所以它不像我假设的经典分区。当然我可以单独进行然后加入,但由于我有很多月度或每周分区,这可能不可行。也许有人有个主意。
答案 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