Сначала попробуйте сами: на собеседовании подсказки не будет.
Интервал между соседними заказами одного клиента даёт lag(created_at) OVER (PARTITION BY customer_id ORDER BY created_at): окно смотрит на предыдущую строку в пределах клиента. Разность timestamp это interval, в дни его переводит extract(epoch ...) / 86400.
У первого заказа клиента lag вернёт NULL, и avg его пропустит сам. Клиентов с одним заказом отсекает HAVING count(*) > 1. Округление round(...::numeric, 1): avg по double не округляется до знаков без приведения к numeric.
WITH gaps AS (SELECT o.customer_id, o.created_at, extract(epoch FROM o.created_at - lag(o.created_at) OVER (PARTITION BY o.customer_id ORDER BY o.created_at)) / 86400 AS gap_days FROM orders o JOIN customers c ON c.customer_id = o.customer_id WHERE c.city = 'Самара') SELECT customer_id, count(*) AS orders, round(avg(gap_days)::numeric, 1) AS