Reputation: 3
So let's say I have 2 tables. One table is for consumers, and another is for sales.
Consumers
ID | Name | ... |
---|---|---|
1 | John Johns | ... |
2 | Cathy Dans | ... |
Sales
ID | consumer_id | purchase_date | ... |
---|---|---|---|
1 | 1 | 01/03/05 | ... |
2 | 1 | 02/04/10 | ... |
3 | 1 | 03/04/11 | ... |
4 | 2 | 02/14/07 | ... |
5 | 2 | 09/24/08 | ... |
6 | 2 | 12/15/09 | ... |
I want to find all instances of consumers who made more than 10 purchases within any 6 month rolling period.
SELECT
consumers.id
, COUNT(sales.id)
FROM
consumers
JOIN sales ON consumers.id = sales.consumer_id
GROUP BY
consumers.id
HAVING
COUNT(sales.id) >= 10
ORDER BY
COUNT(sales.id) DESC
So I have this code, which just gives me a list of consumers who have made more than 10 purchases ALL TIME. But how do I incorporate the rolling 6 month period logic?!
Any help or guidance on which functions can help me accomplish this would be appreciated!
Upvotes: 0
Views: 35
Reputation: 1269873
You can use window functions to count the number of sales in a six-month period. Then just filter down to those consumers:
select distinct consumer_id
from (select s.*,
count(*) over (partition by consumer_id
order by purchase_date
range between current row and interval '6 month' following
) as six_month_count
from sales s
) s
where six_month_count > 10;
Upvotes: 1