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

时间:2018-09-29 12:03:33

标签: sql postgresql select window-functions

请考虑以下事件的表格: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]

是变量

这有可能吗?

2 个答案:

答案 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解决方案

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为窗口功能添加了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

Further reading, JOOQ Blog