You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Datetime列识别日期区间排名,筛选活动间隔超3个月的成员

成员活跃间隔超3个月的Rank列生成方案

需求说明

现有数据表包含成员ID(header 1)、所属组(header 2)、活跃时间(Create Date)三个字段,需要:

  • 识别同一成员同一组内,活跃日期间隔超过3个月的记录
  • 为连续活跃周期(间隔不超3个月)内的记录分配相同Rank,间隔超3个月时Rank递增

目标结果示例

header 1header 2Create DateRank
11111EAM2022-01-27 12:23:28.4740000001
11111EAM2022-08-25 10:41:15.5000000002
11111EAM2022-09-01 18:15:07.3620000002
11111EAM2022-09-08 13:03:38.8590000002
11111EAM2022-10-06 18:15:07.2450000002
11111PEM2022-07-25 10:41:15.5000000001
11111PEM2022-08-25 10:41:15.5000000001
11111PEM2022-09-26 13:03:38.8590000001

解决方案(SQL实现)

通用SQL版本

WITH ranked_records AS (
    SELECT 
        "header 1",
        "header 2",
        "Create Date",
        -- 获取上一条同组同成员的活跃时间,计算月份差
        CASE
            WHEN LAG("Create Date") OVER (PARTITION BY "header 1", "header 2" ORDER BY "Create Date") IS NOT NULL
            THEN ABS(DATEDIFF(MONTH, LAG("Create Date") OVER (PARTITION BY "header 1", "header 2" ORDER BY "Create Date"), "Create Date"))
            ELSE 0
        END AS month_diff,
        -- 标记是否触发新Rank
        CASE 
            WHEN LAG("Create Date") OVER (PARTITION BY "header 1", "header 2" ORDER BY "Create Date") IS NULL
            THEN 0
            WHEN ABS(DATEDIFF(MONTH, LAG("Create Date") OVER (PARTITION BY "header 1", "header 2" ORDER BY "Create Date"), "Create Date")) > 3
            THEN 1
            ELSE 0
        END AS is_new_rank
    FROM your_table_name
)
SELECT 
    "header 1",
    "header 2",
    "Create Date",
    -- 累积求和生成Rank,初始值为1
    1 + SUM(is_new_rank) OVER (PARTITION BY "header 1", "header 2" ORDER BY "Create Date") AS Rank
FROM ranked_records
ORDER BY "header 1", "header 2", "Create Date";

数据库适配说明

不同数据库的日期差函数略有不同,可按需调整:

  • MySQL:用TIMESTAMPDIFF(MONTH, prev_date, curr_date)替代DATEDIFF(MONTH, ...)
  • PostgreSQL:用EXTRACT(MONTH FROM AGE(curr_date, prev_date))计算月份差
  • Oracle:用MONTHS_BETWEEN(curr_date, prev_date)获取月份差

逻辑说明

  1. 用LAG()窗口函数按成员+组分组、按时间排序,获取每条记录的上一条活跃时间
  2. 计算当前记录与上一条的月份差,判断是否超过3个月,标记为is_new_rank(1表示需要递增Rank,0表示不需要)
  3. 用SUM() OVER()累积求和标记值,再加1得到最终Rank——第一条记录默认Rank为1,之后每遇到一次超3个月的间隔,Rank自动加1

内容的提问来源于stack exchange,提问作者MDMP

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 02:35:54