【问题标题】:sql sliding window - finding max value over intervalsql滑动窗口 - 在间隔内找到最大值
【发布时间】:2013-02-06 01:10:36
【问题描述】:

我遇到了滑动窗口问题。具体来说,我不知道我的窗口应该从哪里开始以及应该在哪里结束。我确实知道间隔/窗口的大小。

我需要找到提供最佳(或最差,取决于您如何看待)案例场景的窗口的开始/结束。

这是一个示例数据集:

 value  | tstamp
 100    | 2013-02-20 00:01:00
 200    | 2013-02-20 00:02:00
 300    | 2013-02-20 00:03:00
 400    | 2013-02-20 00:04:00
 500    | 2013-02-20 00:05:00
 600    | 2013-02-20 00:06:00
 500    | 2013-02-20 00:07:00
 400    | 2013-02-20 00:08:00
 300    | 2013-02-20 00:09:00
 200    | 2013-02-20 00:10:00
 100    | 2013-02-20 00:11:00

假设我知道我的间隔需要 5 分钟。所以,我需要知道“值”之和最高的 5 分钟间隔中包含的值和时间戳。在我上面的例子中,从 '2013-02-20 00:04:00' 到 '2013-02-20 00:08:00' 的行将给我一个总和 400+500+600+500+400 = 2400 ,这是该表中 5 分钟内的最高值。

如果需要,我不反对使用多个表。但我试图找到一个“最佳情况”区间。结果可以是任何一种方式,只要它们净间隔。如果我在该时间间隔内获得所有数据点,它仍然有效。如果我得到起点和终点,我也可以使用它们。

我发现了几个 SQL 的滑动窗口问题,但没有发现任何窗口大小是已知因素,起点未知的地方。

【问题讨论】:

  • 您使用的是哪个 RDBMS?
  • 我正在使用 postgres,目前没有太多其他选择。
  • @jasonmclose: 哪个版本的 PosgreSQL?

标签: sql postgresql intervals sliding-window postgresql-8.1


【解决方案1】:
SELECT  *,
        (
        SELECT  SUM(value)
        FROM    mytable mi
        WHERE   mi.tstamp BETWEEN m.tstamp - '5 minute'::INTERVAL AND m.tstamp
        ) AS maxvalue
FROM    mytable m
ORDER BY
        maxvalue DESC
LIMIT   1

在 PostgreSQL 11 及更高版本中:

SELECT  SUM(value) OVER (ORDER BY tstamp RANGE '5 minute' PRECEDING) AS maxvalue,
        *
FROM    mytable m
ORDER BY
        maxvalue DESC
LIMIT   1

【讨论】:

  • 我试过了,我得到了结果,但我不知道我在看什么。您在哪里根据时间戳创建间隔?我在理解查询时遇到了一些问题。
  • @jasonmclose:抱歉,您的请求有误,我以为您需要 5 条记录,而不是 5 分钟。请查看新查询。
  • 就是这样。这正是我需要它做的。非常感谢您的帮助。
  • 这个查询有两个缺陷:它之所以有效,是因为示例数据集中的时间戳总是相隔 1 分钟,而且它的运行时间是二次方。
  • @Changaco:如果时间戳字段被索引,它的运行时间是线性的,而不是二次的。无论事件之间的间隔如何,查询都有效。
猜你喜欢
  • 2019-12-04
  • 2022-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-21
  • 2012-05-30
  • 2017-04-03
  • 1970-01-01
相关资源
最近更新 更多