上一年至今 Window Trino 函数 (PrestoSQL)

Prior Year to Date Window Function for Trino (PrestoSQL)

我试图弄清楚如何仅使用一个 window 函数来获取“前一年至今”时间段内指标的总和和平均值,因为我有很多 window 功能,并希望让我的代码尽可能简单。我不知道其他人是否会觉得这有用,但在这里展示我自己的解决方案以防它有用。

去年至今、之前的 ytd、最后的 ytd 等(公司使用的不同术语)

我是 运行 EMR 上的 PrestoSQL (Trino) 版本 350.0。这只有在 346 版和我认为的更高版本中才有可能。在撰写本文时,这不适用于 PrestoDB。

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

我相信这就是你想要的:

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 子句定义 window 一次并在多个函数中重用它。
  • RANGE window 框架可以直接对日期时间类型进行操作。在这种情况下,范围定义为从当前行 your_date 前 N 天开始的间隔(其中 N 是将该日期偏移到上一年年初所需的天数)和 1 年前当前行的 your_date

您可以在 Trino here.

中找到有关 WINDOWRANGE 用法的更多详细信息