【发布时间】: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' 结果感兴趣(每天一个)。
标签: sql datetime subquery aggregate-functions presto