我的问题与这里的问题非常相似,但我使用的是Presto SQL(在aws-athena上(,在Presto中找不到有关循环的信息。
为了重申这个问题,我想查询一下:
给定的表包含:Day
,Number of Items for this Day
我想要:Day
,Average Items for Last 7 Days before "Day"
因此,如果我有一个表,它包含12月25日至1月25日的数据,那么我的输出表应该包含1月1日至1日25日的信息。从1月1日至25日的每一天,这将是过去7天的平均物品数量。
有可能用presto做这件事吗?
也许你可以试试这个
calendar
公共表表达式(CTE(用于生成两个日期范围之间的日期
with calendar as (
select date_generated
from (
values (sequence(date'2021-12-25', date'2022-01-25', interval '1' day))
) as t1(date_array)
cross join unnest(date_array) as t2(date_generated)),
temp
CTE基本上用于生成date group
,其中包含每个日期组的最后7天
temp as (select c1.date_generated as date_groups
, format_datetime(c2.date_generated, 'yyyy-MM-dd') as dates
from calendar c1, calendar c2
where c2.date_generated between c1.date_generated - interval '6' day and c1.date_generated
and c1.date_generated >= date'2021-12-25' + interval '6' day)
该部分的输出:
日期分组您想要一个运行平均值(AVG OVER
(
select
day, amount,
avg(amount) over (order by day rows between 6 preceding and current row) as avg_amount
from mytable
order by day
offset 6;
我尝试了许多不同的变体来获得;运行平均值";(多亏了Thorsten的回答,我现在知道这就是我想要的(,但无法通过表中的其他列(不包括在我最初的问题中(获得我想要的输出,但这最终奏效了:
SELECT day, <other columns>, avg(amount) OVER (
PARTITION BY <other columns>
ORDER BY date(day) ASC
ROWS 6 PRECEDING) as avg_7_days_amount FROM table ORDER BY date(day) ASC