Предоставление для каждого года / месяца количество новых и повторных клиентов - PullRequest
0 голосов
/ 22 сентября 2019

Привет: из исходной таблицы с именем orders, которая выглядит следующим образом, я хотел бы получить количество новых клиентов за каждый месяц.Моя исходная таблица выглядит следующим образом:

  client|order_id|date_order    
    111|50|2019-01-03
    122|51|2019-02-05
    111|52|2019-02-03
    133|53|2019-03-13
    144|54|2019-04-23    
    122|55|2019-05-15
    133|56|2019-05-17
    161|62|2019-06-07
    163|65|2019-07-22
    172|66|2019-08-10
    111|84|2019-08-18     
    ...|...|...

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

    year|month|new|repeat_cust|total
    2019|01|1|0|1
    2019|02|1|1|2
    2019|03|1|0|1
    2019|04|1|0|1
    2019|05|0|2|2
    2019|06|1|0|1
    2019|07|1|0|1
    2019|08|1|1|2

Thank you for your help.

1 Ответ

1 голос
/ 22 сентября 2019

Вы можете получить в первый раз, когда кто-то заказал, используя оконную функцию (доступную в MySQL 8+), а затем использовать эту информацию для агрегирования:

select year(date), month(date),
       count(distinct case when first_date = date then client end) as new,
       count(distinct case when first_date < date then client end) as repeat,
       count(distinct client) as total 
from (select t.*, min(date) over (partition by client) as first_date
      from t
      group by client
     ) t
group by year(date), month(date);

Примечание: На основании ваших определений, это может подсчитатьКлиент дважды, если у них есть два заказа в первый месяц, они покупают.Возможно, вы захотите:

select year(date), month(date),
       count(distinct case when first_date = date then client end) as new,
       (count(distinct client) -
        count(distinct case when first_date = date then client end) 
       ) as repeat,
       count(distinct client) as total 
from (select t.*, min(date) over (partition by client) as first_date
      from t
     ) t
group by year(date), month(date);

РЕДАКТИРОВАТЬ:

В более ранних версиях вы можете использовать group by и join для того же эффекта:

select year(date), month(date),
       count(distinct case when first_date = date then client end) as new,
       (count(distinct client) -
        count(distinct case when first_date = date then client end) 
       ) as repeat,
       count(distinct client) as total 
from t join
     (select t.client, min(date) as first_date
      from t
     ) c
     using (client)
group by year(date), month(date);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...