【发布时间】:2018-11-25 08:13:14
【问题描述】:
例如,我有来自客户的订单数据,像这样
test = spark.createDataFrame([
(0, 1, 1, "2018-06-03"),
(1, 1, 1, "2018-06-04"),
(2, 1, 3, "2018-06-04"),
(3, 1, 2, "2018-06-05"),
(4, 1, 1, "2018-06-06"),
(5, 2, 3, "2018-06-01"),
(6, 2, 1, "2018-06-01"),
(7, 3, 1, "2018-06-02"),
(8, 3, 1, "2018-06-02"),
(9, 3, 1, "2018-06-05")
])\
.toDF("order_id", "customer_id", "order_status", "created_at")
test.show()
每个订单都有自己的状态,1 表示新创建但未完成,3 表示已付款并完成。
现在,我想对订单来源进行分析
- 新客户(之前没有购买过)
- 老客户(之前已完成购买)
所以我想给上面的数据加一个特征,变成这样
逻辑是针对每个客户的,在第一个订单之前创建的每个状态为3(包括它自己)的订单都算作来自new customer,之后的每个订单都算作old customer。
或者换一种说法,选择第一次出现值3之前的数据(对于每个客户的订单,按日期升序排序)
如何在 SQL 中做到这一点?
我四处寻找,但没有找到好的解决方案。如果在 Python 中,我想也许我会简单地做一些循环来获取值。
【问题讨论】:
-
您可以尝试使用 where exists 或 not exists 在匹配的客户 id 和 theta join (order_id