如何计算 Presto 中每 n 行的窗口函数?

Posted

技术标签:

【中文标题】如何计算 Presto 中每 n 行的窗口函数?【英文标题】:How to compute window function for each nth row in Presto? 【发布时间】:2021-03-15 15:23:33 【问题描述】:

我正在处理一个包含时间序列数据的表,每个用户每分钟都有一行。

我想在 N 个日历日的滚动窗口中计算一些聚合函数。

这是通过

实现的
SELECT
SOME_AGGREGATE_FUN(col) OVER (
        PARTITION BY user_id
        ORDER BY timestamp
        ROWS BETWEEN (60 * 24 * N) PRECEDING AND CURRENT ROW
) as my_col
FROM my_table

但是,我只对每天的结果感兴趣。

即我希望仅在 00:00:00 计算窗口,但我希望窗口本身包含要传递到我的聚合函数中的所有每分钟数据。

现在我正在这样做:

WITH agg_results AS (
    SELECT
    SOME_AGGREGATE_FUN(col) OVER (
        PARTITION BY user_id
        ORDER BY timestamp_col
        ROWS BETWEEN (60 * 24 * N) PRECEDING AND CURRENT ROW
    )
    FROM my_table
)

SELECT * FROM agg_results
WHERE 
timestamp_col = DATE_TRUNC('day', "timestamp_col")

这在理论上是可行的,但它需要多计算 60 * 24 次,导致查询非常慢。

本质上,我正在尝试找到一种方法来根据条件使右侧窗口绑定跳过行。或者,如果实现起来更简单,则每第 n 行(因为我每天都有固定数量的行)。

【问题讨论】:

什么是n?我不是 100% 清楚你想要做什么。一个更具体的例子——带有样本数据和期望的结果——会有所帮助。 我想在 N 个日历日的滚动窗口上计算分钟数据的一些聚合函数,但我只对这些聚合的每个 '24*60' 结果感兴趣(每天一个)。 【参考方案1】:

我认为窗口函数不可能做到这一点。您可以改用子查询,假设您的聚合函数也可以用作常规聚合函数(即,没有OVER() 子句):

select 
    timestamp_col,
    (
        select some_aggregate_fun(t1.col)
        from my_table t1
        where 
            t1.user_id = t.user_id
            and t1.timestamp_col >= t.timestamp_col - interval '1' day 
            and t1.timestamp_col <= t.timestamp_col
    )
from my_table t
where timestamp_col = date_trunc('day', timestamp_col)

我不确定这是否会比您的原始查询执行得更好;您可能需要根据您的实际数据集进行评估。

您可以将interval '1' day 更改为您要使用的实际间隔。

【讨论】:

感谢您的回复。我删除了我的原始评论,因为我在真正理解您的查询做什么之前写了它。我会试试这个并报告。 我不确定这里的礼仪是什么,但我不知道接受你的回答是否算作回报。无论如何,您的解决方案很有效,对我帮助很大。再次感谢。

以上是关于如何计算 Presto 中每 n 行的窗口函数?的主要内容,如果未能解决你的问题,请参考以下文章

取熊猫系列中每 N 行的总和

pb数据窗中中如何按行的条件设置行的颜色

Hive开窗函数总结

Hive开窗函数总结

计算表中每 x 行的平均值并创建新表

Athena (Presto) SQL 窗口函数