Возможно, вы захотите попробовать оконные функции:
select category, timestamp, condition
from (
select
t.*,
min(condition) over(partition by category order by timestamp desc) min_cond
from mytable t
) t
where min_cond = 1
Окно min()
с предложением order by
вычисляет минимальное значение condition
для текущей и последующих строк одного и того же category
: мы можем использовать его в качестве фильтра для удаления строк, для которых есть более свежая строка с 0
.
По сравнению с подходом коррелированных подзапросов, преимущество использования оконных функций состоит в том, что он уменьшает количество сканов, необходимых на столе. Конечно, эти вычисления также имеют свою стоимость, поэтому вам нужно сравнить оба решения с вашими примерами данных.