如何在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 解决方案:
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 INTERVAL
s 的功能,这正是您所期望的 (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
考虑 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 解决方案:
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 INTERVAL
s 的功能,这正是您所期望的 (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