【问题标题】:Presto Window Function - (sum over partition by)Presto Window Function - (对分区求和)
【发布时间】:2021-10-27 01:42:18
【问题描述】:

我有以下 Presto 2 个表格,一个按客户和日期存储预算信息,另一个按客户和日期存储支出信息

select day, client_id, budget_id, budget_period, budget_amount
from budget_table
day client_id budget_id budget_period budget_amount
2021-02-27 1 1-1 daily 10
2021-02-28 1 1-1 daily 10
2021-03-01 1 1-1 daily 10
2021-03-02 1 1-1 daily 10
2021-03-03 1 1-1 daily 10
2021-03-04 1 1-2 monthly 500
2021-03-05 1 1-2 monthly 500
2021-03-06 1 1-2 monthly 500
2021-02-27 2 2-1 monthly 400
2021-02-28 2 2-1 monthly 400
2021-03-01 2 2-1 monthly 400
2021-03-02 2 2-1 monthly 400
2021-03-03 2 2-2 one_time 1000
2021-03-04 2 2-2 one_time 1000
2021-03-05 2 2-2 one_time 1000
2021-03-06 2 2-2 one_time 1000
select day, client_id, spend
from spend_table
day client_id spend
2021-02-27 1 8
2021-02-28 1 9
2021-03-01 1 10
2021-03-02 1 7
2021-03-03 1 6
2021-03-04 1 16
2021-03-05 1 19
2021-03-06 1 18
2021-02-27 2 13
2021-02-28 2 15
2021-03-01 2 14
2021-03-02 2 15
2021-03-03 2 20
2021-03-04 2 25
2021-03-05 2 18
2021-03-06 2 27

以下是所需的输出:

day client_id budget_id budget_period budget_amount spend spend_over_period
2021-02-27 1 1-1 daily 10 8 8
2021-02-28 1 1-1 daily 10 9 9
2021-03-01 1 1-1 daily 10 10 10
2021-03-02 1 1-1 daily 10 7 7
2021-03-03 1 1-1 daily 10 6 6
2021-03-04 1 1-2 monthly 500 16 16
2021-03-05 1 1-2 monthly 500 19 35
2021-03-06 1 1-2 monthly 500 18 53
2021-02-27 2 2-1 monthly 400 13 13
2021-02-28 2 2-1 monthly 400 15 28
2021-03-01 2 2-1 monthly 400 14 14
2021-03-02 2 2-1 monthly 400 15 29
2021-03-03 2 2-2 one_time 1000 20 20
2021-03-04 2 2-2 one_time 1000 25 45
2021-03-05 2 2-2 one_time 1000 18 63
2021-03-06 2 2-2 one_time 1000 27 90

我试过了

select s.day, 
       s.client_id, 
       b.budget_id, 
       b.budget_period, 
       b.budget_amount,
       s.spend,
       case when b.budget_period = 'daily' then s.spend
            when b.budget_period = 'monthly' then sum(s.spend) over (partition by b.budget_id, month(date(s.day))) 
            when as spend_over_period = 'one_time' then sum(s.spend) over (partition by b.budget_id)
       end as budget_over_period
from spend_table as s
    join budget_table as b
        on s.day = b.day
        and s.client_id = b.client_id 
    group by 1,2,3,4,5,6

但是,我收到 u'EXPRESSION_NOT_AGGREGATE' 错误。 有人知道如何在 Presto 中查询以获得所需的输出吗?

【问题讨论】:

    标签: sql sum window presto


    【解决方案1】:

    您可以完全删除group by 子句,并使用order by date(s.day)range between unbounded preceding and current row 为您的窗口函数使用排序和框架:

    select s.day,
           s.client_id,
           b.budget_id,
           b.budget_period,
           b.budget_amount,
           s.spend,
           case
               when b.budget_period = 'daily' then s.spend
               when b.budget_period = 'monthly' then sum(s.spend) over (partition by b.budget_id, month(date(s.day)) order by date(s.day) range between unbounded preceding and current row)
               when b.budget_period = 'one_time' then sum(s.spend) over (partition by b.budget_id order by date(s.day) range between unbounded preceding and current row)
           end as spend_over_period
    from spend_table as s
        join budget_table as b
    on s.day = b.day
        and s.client_id = b.client_id
    order by 2,3,1
    

    输出:

    day client_id budget_id budget_period budget_amount spend spend_over_period
    2021-02-27 1 1-1 daily 10 8 8
    2021-02-28 1 1-1 daily 10 9 9
    2021-03-01 1 1-1 daily 10 10 10
    2021-03-02 1 1-1 daily 10 7 7
    2021-03-03 1 1-1 daily 10 6 6
    2021-03-04 1 1-2 monthly 500 16 16
    2021-03-05 1 1-2 monthly 500 19 35
    2021-03-06 1 1-2 monthly 500 18 53
    2021-02-27 2 2-1 monthly 400 13 13
    2021-02-28 2 2-1 monthly 400 15 28
    2021-03-01 2 2-1 monthly 400 14 14
    2021-03-02 2 2-1 monthly 400 15 29
    2021-03-03 2 2-2 one_time 1000 20 20
    2021-03-04 2 2-2 one_time 1000 25 45
    2021-03-05 2 2-2 one_time 1000 18 63
    2021-03-06 2 2-2 one_time 1000 27 90

    【讨论】:

      猜你喜欢
      • 2016-04-01
      • 1970-01-01
      • 2013-07-25
      • 2020-09-11
      • 2013-12-09
      • 2011-05-17
      • 2015-10-27
      • 2016-10-11
      • 2020-06-23
      相关资源
      最近更新 更多