我有一张表,上面有客户ID、购买日期

我想判断一下在5天的窗口期内是否有3次购买.

注意:不需要连续

Cust Id Date O Purchase
11 09/11/2023
11 13/11/2023
11 15/11/2023
11 21/11/2023
11 23/11/2023
11 24/11/2023
12 16/11/2023
12 21/11/2023
12 25/11/2023
12 01/12/2023
12 03/12/2023
12 05/12/2023

将该表作为输入,用于判断5天窗口中的任何3天. 客户ID 11->

  1. DOP 9/11/2023 + 5天窗口期为14/11/2023
    • 在判断时,它只有2天9/11/2023 13/11/2023,所以它失败了
  2. DOP 13/11/2023+5天窗口期为18/11/2023-失败(仅2条记录)
  3. DOP 15/11/2023 + 5天窗口期为20/11/2023 -未通过(仅1条记录)
  4. DOP 21/11/2023 + 5 days window period is 26/11/2023
    • 判断时有3天2023/11/21、23/11/2023和24/11/2023通过

总体来说-客户ID 11符合在5天窗口期内进行任何3天购买的条件

请让我知道如果问题或清楚.

推荐答案

您可以从不同的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()

EDIT:

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

Mysql相关问答推荐

如何有效地计算共同的朋友/追随者?

在MySQL中存储一条帖子的点赞数量

在停靠容器中备份和恢复MySQL数据库时出现Unicode字符问题

如何在WooCommerce中更新pm_Virtual.meta_Value=#39;否

MySQL - 密码哈希没有预期的格式

MySQL 关于 JSON 数组和子查询的问题

按特定顺序匹配 EventS 和下一个 EventA 之前的第一个 Event 之间的记录

MySQL - 如何根据单列查找重复行?

为什么 `count` 函数有效但 `sum` 无效?

Select 并统计所有条目并根据条目对它们进行分组

使用 SET 变量进行 MySQL 查询

从 SQL 中的左连接和内连接中减go 计数

基于两个单元格值的 SQL 过滤表

MySQL:将日期时间插入其他日期时间字段

你如何在 Node.js 中模拟 MySQL(没有 ORM)?

Spring Boot:Jdbc javax.net.ssl.SSLException:在接收对等方的 close_notify 之前关闭入站

默认为空字符串的列

MySQL Workbench 无法加载 mysql.proc

MySQL错误 1005 (HY000): 无法创建表 'foo.#sql-12c_4' (errno: 150)

邮箱地址可接受的字段类型和大小?