我试图弄清楚如何获得"前一年到目前为止"这段时间的总和和平均值。只使用一个窗口函数,因为我有很多窗口函数,并希望保持我的代码尽可能简单。我不知道其他人是否会发现这有用,但在这里展示我自己的解决方案,以防它有帮助。
去年至今,前一年,去年等(不同公司使用的术语)
我相信这就是你想要的:
SELECT
sum(metric) OVER prior_year_to_date,
avg(metric) OVER prior_year_to_date
FROM orders
WINDOW prior_year_to_date AS (
ORDER by your_date
RANGE BETWEEN
your_date - date_trunc('year', your_date - interval '1' year) PRECEDING AND
interval '1' year PRECEDING
)
一些观察:
- 您可以使用
WINDOW
子句一次定义窗口,并在许多函数中重用它。 RANGE
窗口框架可以直接操作日期时间类型。在这种情况下,范围被定义为当前行的your_date
之前N天开始的间隔(其中N是将该日期抵消到前一年的开始所需的天数)和当前行的your_date
之前1年开始的间隔。
您可以在这里找到有关WINDOW
和RANGE
在Trino中使用的更多详细信息。
我在EMR上运行PrestoSQL (Trino)版本350.0。我认为这只有在版本346及以后才有可能。
select
avg(your_metric)
over (
partition by your_partition_columns
order by (to_unixtime(your_date)/86400)
range between
((to_unixtime(your_date)/86400) - (to_unixtime(last_day_of_month(date_trunc('year',date_add('year',-1,your_date))))/86400))
preceding
and
((to_unixtime(your_date)/86400) - (to_unixtime(last_day_of_month(date_add('year',-1,your_date)))/86400))
preceding
)
as your_metric_avg_prior_year_to_date
from your_table