Просто используйте lead()
, чтобы получить следующую дату. Затем выполните агрегирование на уровне клиента, чтобы определить, есть ли у какой-либо транзакции в течение периода времени еще одна в течение 30 дней для этого клиента.
Наконец, снова агрегируйте:
select avg(case when mindiff < 30 then 1.0 else 0 end) as within_30days
from (select customerid, min(datediff(next_date - date)) as mindiff
from (select t.*, lead(date) over (partition by customerid order by date) as next_date
from transactions t
) t
where date >= '2017-01-01' and date < '2018-01-01'
group by customerid
) c