Например, у меня есть данные заказа от клиентов, например:
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()
![enter image description here](https://i.stack.imgur.com/cItZn.png)
Каждый заказ имеет свой собственный статус, 1
означает вновь созданный, но не завершенный, 3
означает, что он оплачен и завершен.
Теперь я хочу провести анализ заказа, поступившего от
- новых клиентов (которые не совершили покупкудо)
- старых клиентов (которые уже закончили покупку)
, поэтому я хочу добавить функцию к вышеприведенным данным, превратившись в вот это
![enter image description here](https://i.stack.imgur.com/ujTtl.png)
Логика для каждого клиента, каждый заказ, созданный до первого заказа со статусом 3
(включая себя), считается как поступивший от new customer
, и каждый заказ после этогосчитается как old customer
.
Или, если выразить это иначе, выбрать данные до первого вхождения значения 3 (для каждого заказа клиента, сортировать по дате asc)
Как я могу это сделать в SQL?
Я искал вокруг, но не нашел хорошего решения.Если в Python, я думаю, возможно, я просто сделаю какой-то цикл, чтобы получить значения.