Создать флаг, который обновляется на основе даты заказа в Hive - PullRequest
0 голосов
/ 28 февраля 2020

Я хочу создать флаговый столбец "order_type", который будет обновляться согласно разнице дат. Как показано в примере ниже для входных и выходных данных, мое требование заключается в том, что если потребитель совершает покупку через 12 месяцев после своей последней покупки, он должен быть снова учтен как покупатель, впервые приобретающий товар.

Входные данные ниже -

-----------------------------------------
|customer_id|   order_id    |order_date|
-----------------------------------------
|1234       |   1           |2017-07-06|
|1234       |   2           |2018-09-17|
|1234       |   3           |2018-09-20|
|1234       |   4           |2019-05-16|
|1234       |   5           |2020-09-15|
|-----------|---------------|----------|

Выходные данные

--------------------------------------------------------|
|customer_id|   order_id    |order_date| order_type     |
--------------------------------------------------------|
|1234       |   1           |2017-07-06| First purchase |
|1234       |   2           |2018-09-17| First purchase |
|1234       |   3           |2018-09-20| Second purchase|
|1234       |   4           |2019-05-16| Second plus purchase
|1234       |   5           |2020-09-15| First purchase |
|-----------|---------------|----------|----------------|

т.е. Первая сделанная покупка - 2017-07-06 - Первая покупка (вторая покупка) - 2018-09-17 (поскольку разность дат между первой и второй датой более 12 месяцев) - Вторая покупка (третья покупка совершена) - 2018-09-20 (начиная с разницы в датах между вторым и третьим заказом менее 12 месяцев) - Вторая покупка плюс (четвертая покупка совершена) - 2019-05-16 (с момента разница в размерах между третьим и четвертым заказом менее чем за 12 месяцев) - Первая покупка (последняя сделанная покупка) - 2020-09-15 (более 12 месяцев)

1 Ответ

0 голосов
/ 29 февраля 2020

Используйте lag(), чтобы получить предыдущий order_date. Затем кумулятивная сумма для определения групп и row_number() для перечисления:

select t.*,
       row_number() over (partition by customer_id, grp order by order_date) as order_type
from (select t.*,
             sum(case when prev_order_date > add_months(order_date, -12)
                      then 0 else 1
                 end) over (partition by customer_id order by order_date) as grp
      from (select t.*,
                   lag(order_date) over (partition by customer_id order by order_date) as prev_order_date
            from t
           ) t
      ) t;

Это просто отображает тип заказа в виде числа, а не преобразовывает его в фразу на английском языке sh.

...