При этом будут выбраны все покупки за 6 месяцев с даты регистрации пользователя с идентификатором 5
.
SELECT p.*
FROM Purchases p
INNER JOIN Users u ON u.id=p.user_id
WHERE p.purchase_date BETWEEN u.date_of_join AND DATE_ADD(u.date_of_join, INTERVAL 6 MONTH) AND u.id=5;
Выбор среднего тогда тривиален
SELECT AVG(p.purchase_amount)
FROM Purchases p
INNER JOIN Users u ON u.id=p.user_id
WHERE p.purchase_date BETWEEN u.date_of_join AND DATE_ADD(u.date_of_join, INTERVAL 6 MONTH) AND u.id=5;
Если вы хотите, чтобы все интервалы были отдельными столбцами, то это становится немного сложнее, но все еще довольно просто.
SELECT avg_3.amount as avg_3, avg_6.amount as avg_6, avg_9.amount as avg_9
FROM Users u
INNER JOIN (
SELECT AVG(p.purchase_amount) amount, p.user_id
FROM Purchases p
INNER JOIN Users u ON u.id=p.user_id
WHERE p.purchase_date BETWEEN u.date_of_join AND DATE_ADD(u.date_of_join, INTERVAL 3 MONTH)
GROUP BY p.user_id
) as avg_3 ON u.id=avg_3.user_id
INNER JOIN (
SELECT AVG(p.purchase_amount) amount, p.user_id
FROM Purchases p
INNER JOIN Users u ON u.id=p.user_id
WHERE p.purchase_date BETWEEN u.date_of_join AND DATE_ADD(u.date_of_join, INTERVAL 6 MONTH)
GROUP BY p.user_id
) as avg_6 ON u.id=avg_6.user_id
INNER JOIN (
SELECT AVG(p.purchase_amount) amount, p.user_id
FROM Purchases p
INNER JOIN Users u ON u.id=p.user_id
WHERE p.purchase_date BETWEEN u.date_of_join AND DATE_ADD(u.date_of_join, INTERVAL 9 MONTH)
GROUP BY p.user_id
) as avg_9 ON u.id=avg_9.user_id
WHERE u.id=5;