У меня есть эта таблица - «использование продукта». Столбцы в этой таблице: id, rank, product_id, checked_at (отметка времени). Я пытаюсь добавить в эту таблицу еще один столбец (отметку времени) с именем last_inactive и задним числом заполнить этот столбец. Логика для этого
1) Найти create_at для ближайшей следующей записи для того же product_id (упорядочено по рангу)
2) Возьмите эту временную отметку и вычтите 1 секунду и используйте эту временную отметку, чтобы заполнить текущий столбец и продолжить
3) Если следующая строка не существует, используйте now () в качестве значения для last_inactive
Я попробовал следующее, чтобы получить желаемый результат
SELECT *,
coalesce(
date_sub(
(SELECT checked_at
FROM product_usage p2
WHERE p2.rank > p.rank
and p.product_id=p2.product_id
group by id, product_id, created_at
ORDER BY product_id, rank ASC
LIMIT 1 OFFSET 0),
INTERVAL 1 second),
now()
)
as valid_until
FROM product_usage p
where p.product_id = '1111111';
Этот запрос работает для этого конкретного product_id, но он занимает около 2-3 секунд для product_id, и существует около 20k различных product_ids, для которых я хочу, чтобы это работало. Что я могу сделать, чтобы сделать это быстрее?