Я борюсь с тем, как я могу получать отчеты о новых клиентах каждую неделю (тех, кто никогда не заказывал ранее).Результаты должны выглядеть следующим образом:
WEEK_ENDING_DATE NEW_CUSTOMERS
---------------- -------------
2019-02-03 50
2019-02-10 60
Мой запрос выполняет правое внешнее объединение old_orders и new_orders для поиска новых клиентов (см. Запрос ниже).
У меня также есть вспомогательная таблица my_calendars, которая помогает мне группировать по week_end_date.В таблице my_calendars есть строки, содержащие каждую дату в году, соответствующие week_begin_date и week_end_date для этой даты.Например, для даты, такой как 2019-02-15, значением week_begin_date является 2019-02-11, а week_end_date - 2019-02-17 (неделя - понедельник - солнце, формат = ГГГГ-ММ-ДД).Вспомогательная таблица выглядит следующим образом:
DATE WEEK_BEGIN_DATE WEEK_END_DATE
---------- ---------------- -------------
2019-02-15 2019-02-11 2019-02-17
2019-01-08 2019-01-07 2019-01-13
Теперь вернемся к моему запросу.Я хочу, чтобы иметь возможность находить новых клиентов каждую неделю.Проблема в том, что я не могу понять, как разместить каждую неделю года в запросе, чтобы сравнить даты заказа.Старые_заказы - это заказы, сделанные за до 'на этой неделе', а новые_заказы - это те, которые имели место 'на этой неделе'.Запрос работает нормально, когда я использую статические даты, но я изо всех сил пытаюсь сделать даты переменными, т.е. каждую неделю в году.Смотрите мои вопросы в запросе, где у меня есть проблемы.
SELECT
new_orders.week_end_date
,COUNT(DISTINCT new_orders.customer) AS new_customers
FROM
(SELECT *
FROM orders old
INNER JOIN my_calendar cal ON cal.date = old.order_date
#The line below works, but it's a static date of Feb 4. How do I replace it with each week in the calendar
WHERE cal.week_end_date < '2019-02-04'
#The commented line below does not work
#WHERE cal.date < cal.week_end_date
) AS old_orders
RIGHT OUTER JOIN (SELECT *
FROM order_items_view new
INNER JOIN my_calendar cal ON cal.date = new.order_date
#How do I replace the static dates below and compare with each week in the calendar
WHERE cal.date BETWEEN '2019-02-04' and '2019-02-10'
#The commented line below didn't work
#WHERE cal.week_end_date = cal.week_end_date
) AS new_orders
ON new_orders.customer = old_orders.customer
WHERE old_orders.customer IS NULL
GROUP BY new_orders.week_end_date