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

标签 sql datetime subquery aggregate-functions presto

我正在使用一个包含时间序列数据的表,每个用户每分钟都有一行。
我想在 的滚动窗口上计算一些聚合函数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 次计算,导致查询速度非常慢。
本质上,我试图找到一种方法来根据条件使右窗口绑定(bind)跳过行。或者,如果实现起来更简单,那么对于每第 n 行(因为我每天都有固定数量的行)。

最佳答案

我认为窗口函数不可能。您可以改为使用子查询,假设您的聚合函数也可以用作常规聚合函数(即,没有 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到您要使用的实际间隔。

关于sql - 如何计算 Presto 中每 n 行的窗口函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65128903/

相关文章:

sql - 调整 SQL 语句性能

sql - 选择更多行作为列

SQL 帮助 - 基于 BIT 变量的条件 where 子句 - SQL Server

javascript - 将 Javascript 日期解析为 C# DateTime,FF 数据不同于 Chrome 日期

java - JodaTime 使用 EXIF 元数据中的日期字符串抛出 IllegalArgumentException

mysql - 长查询中重复子查询的替代方法

Java 在运行相同的查询时从 SQL 返回不同的结果

datetime - os.difftime(t2, t1) 的用途是什么,但 t2 - t1 未涵盖?

sql - 需要加快这条SQL语句的结果。有什么建议吗?

View 内的 MySql 子查询