【问题标题】:Summing a sequence of amounts iteratively grouped by ID and by date in Presto在 Presto 中对按 ID 和按日期迭代分组的一系列金额求和
【发布时间】:2018-09-27 17:20:34
【问题描述】:

我正在尝试在 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 个月的最后一天?我知道您可以使用临时表等,但我对此并不十分熟悉。

提前致谢。

【问题讨论】:

    标签: amazon-athena presto


    【解决方案1】:

    你需要创建一个如下的窗口函数。

    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
    

    希望对您有所帮助。

    【讨论】:

    • 嗯,这很简单。谢谢