amazon-athena - 在 Presto 中对按 ID 和日期迭代分组的一系列金额求和
问题描述
我正在尝试在 Amazon Athena 中运行一个查询,在该查询中我将每个 ID 的事务序列加到特定日期。指定日期产生该时间点的余额。对于每个 ID,我需要包含第一笔交易才能获得正确的余额。数据结构如下
ID | Amount | Created
________________________
378218 -450.00 2018-09-27
378218 4500.00 2018-09-27
260709 899.00 2018-09-27
70791 -719.96 2018-09-27
70791 -65.00 2018-09-19
70791 -3.16 2018-09-07
70791 3.16 2018-09-07
70791 61.84 2018-09-01
70791 -61.84 2018-09-01
70791 -65.00 2018-08-16
70791 -61.84 2018-08-01
很容易获得某一特定日期所有 ID 的余额:
SELECT SUM(amount), ID, created
FROM db.table where created<'2018-10-01'
GROUP BY ID
这会产生以下结果:
ID | Amount | Created
________________________
70791 344.10 2015-09-27
260709 899.00 2018-09-27
378218 0.00 2018-09-27
上面的查询给了我 9 月 30 日的余额。但是,如何在一个查询中实现多个时间点,例如过去 12 个月的最后一天?我知道您可以使用临时表等,但我对此并不熟悉。
提前致谢。
解决方案
您将需要创建一个窗口函数,如下所示。
SELECT id, created,sum(amount) over (partition by id order by created)
balance_at_date
FROM "db"."table"
order by id, created;
我有如下数据
ID,AMOUNT,CREATED
123,100,2018-09-01
123,200,2018-09-15
123,-50,2018-09-18
345,100,2017-01-01
345,50,2018-01-01
345,-200,2018-09-01
查询返回如下输出:
id created balance_at_date
123 2018-09-01 100
123 2018-09-15 300
123 2018-09-18 250
345 2017-01-01 100
345 2018-01-01 150
345 2018-09-01 -50
希望有帮助。
推荐阅读
- influxdb-python - InfluxDBClientError:未找到保留策略:autogen
- c# - Asp.Net MVC 5 - 自定义授权不起作用?
- java - Selenium:转换列表
设置 - arrays - 数组中子数组的并行向量化减少,无需显式迭代
- ios - 通过 OMEMO 进行文件共享,在另一端离线时也可以使用
- angular - 为什么 httpbin.org 在 POST OR 请求中添加 API URL 我使用 angular cli proxy conf 来调用 API
- angular - 如何在 Angular 6 Cli 项目中为第二个根组件定义路由
- react-native - TypeError:未定义不是对象(评估“data.hasread.userId”)
- css - 具有奇怪定义和 CSS 动画的 SVG
- python - 如何在递归中使用正则表达式