如何在SQLwindow函数中表达window帧与当前行的属性值相关?

How to express window frame in SQL window function relating to property value of current row?

考虑 table 形式的事件:id,price,timestamp。对于每个事件,我想获取 [curEvent.timestamp, curEvent.timestamp + 10sec]

之间发生的所有事件的 min(price)

SQL window 函数似乎是合乎逻辑的候选者。

例如,如果我确定我想检查当前事件之后有多少事件来计算 min(price),这将通过以下方式完成:

SELECT *,min(price) OVER (ORDER BY timestamp ROWS BETWEEN 1 FOLLOWING AND 100 FOLLOWING) AS min_price from events

但是,我不知道前面events/rows的数量。相反,我希望它基于 [curEvent.timestamp, curEvent.timestamp + 10sec]

可变

这可能吗?

我想不出使用 window 函数来完成此操作的方法,但您可以改用关联子查询:

SELECT *,
       (SELECT MIN(price)
        FROM   events
        WHERE  ts BETWEEN e.ts AND e.ts + INTERVAL '10 SECOND')
FROM   events e

PostgreSQL 11 解决方案:

demo: db<>fiddle

SELECT
    price, 
    ts,
    min(price) OVER (ORDER BY ts RANGE BETWEEN CURRENT ROW AND INTERVAL '10 seconds' FOLLOWING)
FROM times

Postgres 11 为 window 函数添加了 RANGE BETWEEN INTERVALs 的功能,这正是您所期望的 (documentation):

示例数据(前两列)和结果(第三列):

price   ts                      min
1       2018-09-09 10:00:00     1
2       2018-09-09 10:00:04     2
100     2018-09-09 10:00:09.8   10
200     2018-09-09 10:00:10     3.5
20      2018-09-09 10:00:11     3.5
10      2018-09-09 10:00:19     3.5
3.5     2018-09-09 10:00:20     3.5
35      2018-09-09 10:00:21     35

Further reading, JOOQ Blog