Можно попробовать с помощью case и оконных функций LAG (предыдущее значение).
coef - коэффициент уменьшения, защита от 0
pr = 1 там где за последние 2 часа увеличилось в X раз
select *
from (
select id_field, n_field, v_field, dt_field,
(case when dt_field > now()-INTERVAL '2 hours' and
v_field > (LAG(v_field,1,v_field) OVER (partition by n_field order by dt_field)) * X then 1 else 0 end) as pr,
v_field/(case when (LAG(v_field,1,v_field) OVER (partition by n_field order by dt_field)) = 0 then 1
else LAG(v_field,1,v_field) OVER (partition by n_field order by dt_field)
end) as coef
from table ) a
where a.pr = 1
UPD: с интервалом я там намудрил, там тоже предыдущее значение даты надо получать через LAG вместо now