Trino (PrestoSQL) 的上一年度迄今为止的窗口函数

Posted

技术标签:

【中文标题】Trino (PrestoSQL) 的上一年度迄今为止的窗口函数【英文标题】:Prior Year to Date Window Function for Trino (PrestoSQL) 【发布时间】:2021-11-07 05:15:39 【问题描述】:

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

去年至今、年初至今、去年年初至今等(公司使用不同的术语)

【问题讨论】:

【参考方案1】:

我在 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

【讨论】:

您不需要将 unixtimes 除以 86400(这会将它们转换为天数)它只是让我在构建时更容易检查。 这里是简化版: select avg(your_metric) over ( partition by your_partition_columns order by to_unixtime(your_date) range between (to_unixtime(your_date) - to_unixtime(last_day_of_month(date_trunc('year',date_add(') year',-1,your_date))))) 和 (to_unixtime(your_date) - to_unixtime(last_day_of_month(date_add('year',-1,your_date)))) 作为 your_metric_avg_prior_year_to_date from your_table【参考方案2】:

我相信这就是你想要的:

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 是将该日期偏移到上一年年初所需的天数)和 @ 前一年当前行为 987654327@。

您可以在 Trino here 中找到有关 WINDOWRANGE 的使用的更多详细信息。

【讨论】:

这个比较简单,谢谢帮助!!

以上是关于Trino (PrestoSQL) 的上一年度迄今为止的窗口函数的主要内容,如果未能解决你的问题,请参考以下文章

Where 子句 (T-SQL) 中的财政年度迄今为止

使用 MDX 从层次结构中获取当前会计年度

Spark Trino 连接

如果我对非索引字段进行查询,是不是使用全表扫描

SAP问题. 如何冲销上一年度的付款凭证?

在AWS Glue上使用JDBC连接Trino