У меня есть база данных, содержащая транзакции продаж. Они представлены в следующем (упрощенном) формате:
sales_id | customer_id | sales_date | number_of_units | total_price
Цель моего запроса - для каждой из этих транзакций получить количество продаж, которые этот конкретный customer_id совершил до текущей записи, за всю историю этой базы данных, но также и за 365 дней до текущей записи.
Пожизненные продажи работают прямо сейчас, но последние 365 дней я застрял. Мой запрос сейчас может идентифицировать, если у записи была хотя бы одна продажа за предыдущие 365 дней, и я делаю это так:
SELECT sales_id ,customer_id,sales_date,number_of_units,total_price,
ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY sales_date ASC) as 'LifeTimeSales' ,
CASE WHEN DATEDIFF(DAY,sales_date,LAG(sales_date, 1) OVER (PARTITION BY customer_id ORDER BY sales_date ASC)) > -365
THEN 1 ELSE 0 END as 'Last365Sales'
FROM sales_db
+ некоторые не важные пункты WHERE. После чего я агрегирую результат этого запроса некоторыми другими способами.
Но это не говорит мне, является ли эта покупка, например, 4-й продажей в предыдущие 365 дней покупателя.
Примечание:
Этот запрос ежедневно выполняется для полной базы данных с 6 миллионами записей и продолжает расти. Я опускаю и воссоздаю эту таблицу прямо сейчас, что явно неэффективно. Обновление таблицы при появлении новых продаж было бы идеальным, но сейчас это невозможно создать. Есть идеи?
Некоторые данные испытаний:
sales_id,customer_id,sales_date,number_of_units,total_price
1001,2001,2016-01-01,1,86
1002,2001,2016-08-01,3,98
1003,2001,2017-06-01,2,87
1004,2002,2017-06-01,2,15
+ ожидаемый результат:
sales_id,customer_id,sales_date,number_of_units,total_price,LifeTimeSales,Last365Sales
1001,2001,2016-01-01,1,86,0,0
1002,2001,2016-08-01,3,98,1,1
1003,2001,2017-06-01,2,87,2,1
1004,2002,2017-06-01,2,15,0,0