原始数据帧:
member_id | AccessDate | 111111 | 2020-02-03 |
---|---|
111111 | 2022-03-05 |
222222 | 2015-03-04 |
333333 | 2021-11-23 |
333333 | 2021-11-24 |
333333 | 2021-11-25 |
333333 | 2022-10-11 |
333333 | 2022-10-12 |
333333 | 2022-10-13 |
333333 | 2022-07-07 |
444444 | 2019-01-21 |
444444 | 2019-04-21 |
444444 | 2019-04-22 |
444444 | 2019-04-23 |
444444 | 2019-04-24 |
444444 | 2019-05-05 |
444444 | 2019-05-06 |
444444 | 2019-05-07 |
可以这样做:(使用"gap & & islands"-很快会添加细节)
df.select(F.col("member_id"), F.col("AccessDate").cast("Date"))
.withColumn("row_num", F.row_number().over(Window().orderBy(F.lit('A'))))
.withColumn("bucket", F.col("AccessDate")-F.col("row_num"))
.groupBy("bucket", "member_id")
.agg(F.max("AccessDate").alias("AccessDate"), F.count("*").alias("cnt"))
.orderBy(F.col("cnt").desc(), F.col("AccessDate").desc())
.groupBy("member_id")
.agg(F.first("cnt"), F.first("AccessDate"))
.show();
了解更多关于系列问题的知识- https://blog.jooq.org/how-to-find-the-longest-consecutive-series-of-events-in-sql/