Подсчитать количество транзакций в месяц для отдельной группы по дате Hive - PullRequest
0 голосов
/ 13 апреля 2020

У меня есть таблица транзакций клиентов, где каждый предмет, купленный клиентом, хранится в одной строке. Таким образом, для одной транзакции в таблице может быть несколько строк. У меня есть еще один столбец с именем visit_date . Существует столбец категории cal_month_nbr , который варьируется от 1 до 12 в зависимости от того, в каком месяце произошла транзакция.

Данные выглядят как ниже

Id          visit_date     Cal_month_nbr
----        ------          ------
1           01/01/2020      1
1           01/02/2020      1
1           01/01/2020      1
2           02/01/2020      2
1           02/01/2020      2
1           03/01/2020      3
3           03/01/2020      3

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

id    cal_month_nbr       visit_per_month
---        ---------     ----
1           1             2
1           2             1
1           3             1
2           2             1
3           3             1

и какова средняя частота посещений на идентификаторы ie.

id            Avg_freq_per_month
----          -------------
1              1.33
2              1
3              1

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

select avg(count_e) as num_visits_per_month,individual_id
from
(
    select r.individual_id, cal_month_nbr, count(*) as count_e
 from 
  ww_customer_dl_secure.cust_scan 
         GROUP  by 
         r.individual_id, cal_month_nbr
         order by count_e desc
         ) as t
         group by individual_id

Буду признателен за любую помощь, руководство или предложения

1 Ответ

0 голосов
/ 13 апреля 2020

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

select individual_id,
       count(*) / count(distinct cal_month_nbr)
from  ww_customer_dl_secure.cust_scan c
group by individual_id;

Если вы хотите среднее количество дней в месяце, то:

select individual_id,
       count(distinct visit_date) / count(distinct cal_month_nbr)
from  ww_customer_dl_secure.cust_scan c
group by individual_id;

На самом деле, Hive может неэффективен при расчете count(distinct), поэтому несколько уровней агрегации могут быть быстрее:

select individual_id, avg(num_visit_days)
from (select individual_id, cal_month_nbr, count(*) as num_visit_days
      from (select distinct individual_id, visit_date, cal_month_nbr
            from ww_customer_dl_secure.cust_scan c
           ) iv 
      group by individual_id, cal_month_nbr
     ) ic
group by individual_id;
...