创建一个根据 Hive 中的订单日期更新的标志

Posted

技术标签:

【中文标题】创建一个根据 Hive 中的订单日期更新的标志【英文标题】:Create a flag which updated on the basis of Order date in Hive 【发布时间】:2020-02-28 19:34:48 【问题描述】:

我想创建一个标志列“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】:

使用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;

这只是将订单类型显示为数字,而不是转换为英文短语。

【讨论】:

我不能在这里使用 datediff 函数,因为我必须找到 365 天期间的日期差异吗? @DipanjanMallick 。 . .那是另一种选择。 另外,我忘了提到我需要将它分为三个桶。如上所述第一次购买,第二次购买和第二次购买,这就是为什么必须转换为英文短语。 @DipanjanMallick 。 . .该数字应该足以回答您的问题。

以上是关于创建一个根据 Hive 中的订单日期更新的标志的主要内容,如果未能解决你的问题,请参考以下文章

如何根据行创建日期在 PostgreSQL 中创建自定义序列?

增强SAP生产订单下达保存时更新批次特性值

增强SAP生产订单下达保存时更新批次特性值

创建一个触发器,当另一个表中的列更新时更新一个表上的列

查询根据发布日期过滤订单?

根据跨日期范围对订单进行分组