mysql SQL/Pyspark -检查条件

czq61nw1  于 12个月前  发布在  Mysql
关注(0)|答案(1)|浏览(217)

我有一个表,客户ID,购买日期
我想看看是否有3个购买在5天的窗口期。
注:不需要连续
| 客户ID|购买日期|
| --|--|
| 11 |2023年11月9日|
| 11 |2023年11月13日|
| 11 |2023年11月15日|
| 11 |2023年11月21日|
| 11 |2023年11月23日|
| 11 |2023年11月24日|
| 12 |2023年11月16日|
| 12 |2023年11月21日|
| 12 |2023年11月25日|
| 12 |2023年12月1日|
| 12 |2023年12月03日|
| 12 |2023年12月5日|
将该表视为检查5天窗口中任意3天的输入。对于客户ID 11 ->

  • DOP 9/11/2023 + 5天窗口期为14/11/2023
  • 在检查它只有2天9/11/2023和13/11/2023,所以它失败了
  • DOP 13/11/2023 + 5天窗口期为18/11/2023 -未通过(仅2条记录)
  • DOP 15/11/2023 + 5天窗口期为20/11/2023 -未通过(仅1条记录)
    *DOP 21/11/2023 + 5天窗口期为26/11/2023
  • 在检查它有3天21/11/2023,23/11/2023和24/11/2023,所以它通过

在总体级别上- CustomerID 11通过了在5天窗口期内进行任何3天购买的条件
请让我知道如果问题或清楚。

eit6fx6z

eit6fx6z1#

您可以从不同的Angular 来看待这个问题,以简化解决方案,对于每3次连续的购买,检查其中一次是否在5天的范围内,并且在按“Date O Purchase”(购买日期)排序数据后进一步简化,您只需要按该顺序检查当前行和当前行(这意味着最近3次购买)并检查这2行的日期是否在5天内,这里是PySpark中的解决方案:

w = Window.partitionBy("Cust_Id").orderBy("Date_Of_Purchase")
df = df.withColumn("Date_Of_Purchase", to_date(col("Date_Of_Purchase"), "dd/MM/yyyy")) \
    .withColumn("Prev_Date_Of_Purchase", lag("Date_Of_Purchase", 2).over(w)) \
    .withColumn("days_between", datediff(col("Date_Of_Purchase"), col("Prev_Date_Of_Purchase")))
df.show()

df.filter(col("days_between") <= 5).select("Cust_Id").distinct().show()

字符串

编辑:

您可以通过将lag("Date_Of_Purchase", 2)中的2更改为购买次数-1,并将.filter(col("days_between") <= 5)中的5更改为天数间隔窗口来概括这一点。

相关问题