tgoop.com/sqlhub/1961
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.
- В финальном
SELECT фильтруем только те пары, где разница между датами ≤ 7 дней.⚠️ Важно:
- Клиенты с одной покупкой отфильтруются (у них нет второй).
- Сравнение выполняется через
INTERVAL '7 days', чтобы корректно обрабатывать даты.- Это не поиск любых двух покупок в пределах 7 дней, а именно проверка интервала между первой и второй.
@sqlhub
BY Data Science. SQL hub
Share with your friend now:
tgoop.com/sqlhub/1961
