Сначала попробуйте сами: на собеседовании подсказки не будет.
Правило «после первой неудачи за день остальные запуски не считаются» требует знать, была ли неудача раньше в тот же день у того же источника. Это накопительная сумма флага ошибки по окну PARTITION BY collection_name, started_at::date ORDER BY started_at с рамкой до предыдущей строки: prev_failed больше нуля означает, что до этого запуска уже была неудача.
Считаем только строки с prev_failed = 0: успешные и первую неудачу дня. Фильтр по марту стоит до оконной функции, чтобы февральская ошибка не влияла на март.
WITH marked AS (SELECT last_error, sum(CASE WHEN last_error <> '' THEN 1 ELSE 0 END) OVER (PARTITION BY collection_name, started_at::date ORDER BY started_at, run_id ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) AS prev_failed FROM migration_report WHERE started_at >= '2025-03-01' AND started_at < '2025-04-01') SELECT count(*) FILTER (WHERE last_error = '' AND coalesce(prev_failed, 0) = 0) AS succeeded, count(*) FILTER (WHERE last_error <> '' AND coalesce(prev_failed, 0) = 0) AS failed FROM marked