在SQL上运行超过日期的总和

时间:2019-05-13 04:08:43

标签: sql presto

我正在尝试使用Presto SQL从下面的示例数据计算日期t和s列的累积总和。

Date   | T | S 
1/2/19 | 2 | 5
2/1/19 | 5 | 1
3/1/19 | 1 | 1

我想得到

Date   | T | S | cum_T | cum_S 
1/2/19 | 2 | 5 |    2  |  5 
2/1/19 | 5 | 1 |    7  |  6
3/1/19 | 1 | 1 |    8  |  7

但是,当我使用Presto SQL运行以下查询时,收到一条意外的错误消息,告诉我将T和S列按查询的一部分逐组放置。

这是预期的吗?当我从查询中删除分组依据时,它运行无误,但产生重复的日期行。 +

select
  date_trunc('day',tb1.date),
  sum(tb1.S) over (partition by date_trunc('day',tb1.date) order by date_trunc('day',tb1.date) rows unbounded preceding )  as cum_S,
  sum(tb1.T) over (partition by date_trunc('day',tb1.date) order by date_trunc('day',tb1.date) rows unbounded preceding)  as cum_T
from esi_dpd_bi_esds_prst.points_tb1_use_dedup_18months_vw tb1
where 
  tb1.reason_id not in (45,264,418,983,990,997,999,1574)
  and tb1.group_id not in (22)
  and tb1.point_status not in (3)
  and tb1.date between cast(DATE '2019-01-01' as date) and cast( DATE '2019-01-03' as date)
group by 
    1
order by date_trunc('day',tb1.date) desc 

错误看起来像这样:

Error: line 3:1: '"sum"(tb1.S) OVER (PARTITION BY "date_trunc"('day', tb1.tb1) ORDER BY "date_trunc"('day', tb1.tb1) ASC ROWS UNBOUNDED PRECEDING)' must be an aggregate expression or appear in GROUP BY clause.

1 个答案:

答案 0 :(得分:1)

您有一个聚合查询,并且想要将聚合与窗口函数混合在一起。正确的语法是:

select date_trunc('day', tb1.date),
       sum(tbl1.S) as S,
       sum(tbl1.T) as T,
       sum(sum(tb1.S)) over (order by date_trunc('day', tb1.date) rows unbounded preceding )  as cum_S,
       sum(sum(tb1.T)) over (order by date_trunc('day', tb1.date) rows unbounded preceding)  as cum_T
from esi_dpd_bi_esds_prst.points_tb1_use_dedup_18months_vw tb1
where tb1.reason_id not in (45, 264, 418, 983, 990, 997, 999, 1574) and
      tb1.group_id not in (22) and
      tb1.point_status not in (3) and
      tb1.date between cast(DATE '2019-01-01' as date) and cast( DATE '2019-01-03' as date)
group by 1
order by date_trunc('day', tb1.date) desc ;

也就是说,窗口函数在汇总后 运行,并且需要处理汇总值。