如何在SQL窗口函数中表示与当前行的属性值相关的窗口框架?

如何在SQL窗口函数中表示与当前行的属性值相关的窗口框架?,sql,postgresql,select,window-functions,Sql,Postgresql,Select,Window Functions,考虑以下形式的事件表:id、price、timestamp。对于每个事件,我希望获得[curEvent.timestamp,curEvent.timestamp+10sec]之间发生的所有事件的min(price) SQL窗口函数似乎是一个合乎逻辑的候选者 例如,如果我确定在当前事件之后要检查多少个事件以计算min(price),则可以使用以下方法完成: SELECT *,min(price) OVER (ORDER BY timestamp ROWS BETWEEN 1 FOLLOWING A

考虑以下形式的事件表:
id、price、timestamp
。对于每个事件,我希望获得
[curEvent.timestamp,curEvent.timestamp+10sec]之间发生的所有事件的
min(price)

SQL窗口函数似乎是一个合乎逻辑的候选者

例如,如果我确定在当前事件之后要检查多少个事件以计算
min(price)
,则可以使用以下方法完成:

SELECT *,min(price) OVER (ORDER BY timestamp ROWS BETWEEN 1 FOLLOWING AND 100 FOLLOWING) AS min_price from events
但是,我不知道前面的事件/行数。相反,我希望它是基于
[curEvent.timestamp,curEvent.timestamp+10秒]


这是完全可能的吗?

我想不出用窗口函数来实现这一点的方法,但您可以使用腐蚀子查询:

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

PostgreSQL 11解决方案

Postgres 11为窗口函数添加了间隔
s之间的
范围功能,该功能完全符合您的期望():

样本数据(前两列)和结果(第三列):


为什么投否决票?我也不知道。这不起作用,因为这个
WHERE
子句带有
@S-mannice catch!在那里编辑。很好的解决方案。啊,太棒了。我已经接受了另一个答案,但这看起来更好。我很快就会试试。
SELECT
    price, 
    ts,
    min(price) OVER (ORDER BY ts RANGE BETWEEN CURRENT ROW AND INTERVAL '10 seconds' FOLLOWING)
FROM times
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