Tengo la siguiente consulta para devolver la cantidad de usuarios que reservaron un vuelo al menos dos veces, pero necesito identificar aquellos que han reservado un vuelo más de una vez en el rango de 12 meses.
SELECT COUNT(*) FROM sales WHERE customer in ( SELECT customer FROM sales GROUP BY customer HAVING COUNT(*) > 1 )Usarías funciones de ventana. El método más simple es lag() :
select count(distinct customer) from (select s.*, lag(date) over (partition by customer order by date) as prev_date from sales s ) s where prev_date > s.date - interval '12 month';Al costo de una auto-unión, la respuesta de @AdrianKlaver puede adaptarse a cualquier período de 12 meses.
SELECT COUNT(DISTINCT customer) FROM (SELECT customer FROM sales s1 JOIN sales s2 ON s1.customer = s2.customer AND s1.ticket_id <> s2.ticket_id AND s2.date_field BETWEEN s1.date_field AND (s1.date_field + interval'1 year') GROUP BY customer HAVING COUNT(*) > 1) AS subquery;Una puñalada con un campo de fecha inventado:
SELECT COUNT(*) FROM sales WHERE customer in ( SELECT customer FROM sales WHERE date_field BETWEEN '01/01/2019' AND '12/31/2019' GROUP BY customer HAVING COUNT(*) > 1 )