tgoop.com/sqlhub/1963
Create:
Last Update:
Last Update:
🧠 Хитрая SQL-задача: вторая покупка в течение 7 дней
У вас есть таблица purchases
:
purchases (
id SERIAL PRIMARY KEY,
customer_id INT,
purchase_date DATE,
amount NUMERIC
)
Задача:
Найти всех клиентов, у которых вторая покупка произошла не позднее, чем через 7 дней после первой.
Показать:
-
customer_id
-
first_purchase_date
-
second_purchase_date
✅ Решение:
WITH ordered_purchases AS (
SELECT
customer_id,
purchase_date,
ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY purchase_date) AS rn
FROM purchases
),
first_second_purchases AS (
SELECT
p1.customer_id,
p1.purchase_date AS first_purchase_date,
p2.purchase_date AS second_purchase_date
FROM ordered_purchases p1
JOIN ordered_purchases p2
ON p1.customer_id = p2.customer_id
AND p1.rn = 1
AND p2.rn = 2
)
SELECT *
FROM first_second_purchases
WHERE second_purchase_date <= first_purchase_date + INTERVAL '7 days';
🔍 Пояснение:
-
ROW_NUMBER()
присваивает каждой покупке порядковый номер в рамках клиента.- Через self-join соединяем первую и вторую покупку клиента.
- Далее фильтруем, оставляя только те, у кого вторая покупка была не позднее 7 дней после первой.
⚠️ Важно:
- Клиенты с одной покупкой исключаются — у них нет второй.
- Мы не ищем любые две покупки в пределах 7 дней, а только первую и вторую по порядку.
-
INTERVAL '7 days'
обеспечивает корректное сравнение дат.@sqlhub
BY Data Science. SQL hub
Share with your friend now:
tgoop.com/sqlhub/1963