У меня есть большая таблица с отметками времени транзакций (цен) для ряда контрактов, последние можно определить по сроку их действия (дата). Моя цель - рассчитать «стандартный» контракт путем интерполяции. Поэтому мне нужны два контракта с истечением, ближайшим к цели. Например, если цель (expiry - timestamp :: date) = 30 дней, мне нужны все транзакции из последнего контракта, где (expiry - timestamp :: date) <30, а также все транзакции для первого контракта, где (expiry - timestamp :: date)> = 30.
Возможно ли реализовать это в предложении WHERE
? Т.е. что-то вроде следующего псевдокода:
SELECT * FROM table
WHERE expiry = last(expiry < timestamp::date + 30)
OR expiry = first(expiry >= timestamp::date + 30)
Я экспериментировал с подзапросами (ниже). Тем не менее, подзапросы возвращают ровно одну дату для всей таблицы, в то время как мне нужно MAX (expiry) относительно (timestamp :: date + 30) для отметки времени каждой строки.
SELECT * FROM table_name
WHERE (expiry = (
SELECT MAX(expiry) FROM table_name
WHERE expiry < timestamp::date + 30
)
OR
expiry = (
SELECT MIN(expiry) FROM table_name
WHERE expiry > timestamp::date + 30
)
);