Как выразить оконную раму в оконной функции SQL, относящуюся к значению свойства текущей строки? - PullRequest
0 голосов
/ 29 сентября 2018

Рассмотрим таблицу событий вида: 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 голосов
/ 29 сентября 2018

Решение 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 sдля оконных функций, которые выполняют именно то, что вы ожидаете ( документация ):

Пример данных (первые 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

Дополнительная информация, Блог JOOQ

0 голосов
/ 29 сентября 2018

Я не могу придумать способ сделать это с помощью оконной функции, но вместо этого вы можете использовать коррелированный подзапрос:

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