MYSQL-запрос для получения новых клиентов каждую неделю - PullRequest
0 голосов
/ 16 февраля 2019

Я борюсь с тем, как я могу получать отчеты о новых клиентах каждую неделю (тех, кто никогда не заказывал ранее).Результаты должны выглядеть следующим образом:

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

1 Ответ

0 голосов
/ 16 февраля 2019

Я бы сначала использовал агрегированный подзапрос для вычисления даты первого заказа каждого клиента, а затем соединил бы результат с таблицей календаря:

SELECT
    c.week_end_date,
    COUNT(o.customer) AS new_customers
FROM
    my_calendar AS c
    LEFT JOIN (
        SELECT customer, MIN(order_date) first_order_date
        FROM orders
        GROUP BY customer
    ) AS o ON c.date = o.first_order_date
GROUP BY c.week_end_date
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...