如何在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