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 中找到有关 WINDOW
和 RANGE
的使用的更多详细信息。
【讨论】:
这个比较简单,谢谢帮助!!以上是关于Trino (PrestoSQL) 的上一年度迄今为止的窗口函数的主要内容,如果未能解决你的问题,请参考以下文章