请考虑以下事件的表格:id,price,timestamp
。对于每个事件,我都希望获取min(price)
[curEvent.timestamp, curEvent.timestamp + 10sec]
似乎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 + 10sec]
这有可能吗?
答案 0 :(得分:1)
我想不出使用window函数执行此操作的方法,但是您可以改用杂乱子查询:
SELECT *,
(SELECT MIN(price)
FROM events
WHERE ts BETWEEN e.ts AND e.ts + INTERVAL '10 SECOND')
FROM events e
答案 1 :(得分:1)
PostgreSQL 11解决方案:
SELECT
price,
ts,
min(price) OVER (ORDER BY ts RANGE BETWEEN CURRENT ROW AND INTERVAL '10 seconds' FOLLOWING)
FROM times
Postgres 11为窗口功能添加了RANGE BETWEEN INTERVAL
的功能,这些功能完全符合您的期望(documentation):
样本数据(前2列)和结果(第3列):
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