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

基于Datetime列按分组及≥1个月间隔划分Rank的技术需求

按分组划分日期连续区间的Rank需求

现有成员数据包含MID、Group、File Type及活跃时间Create_Date,需按MID、Group、File Type分组,当组内连续Create_Date间隔≥1个月时,为该组内的日期范围划分Rank。

输入示例

MIDGroupFile TypeCreate_Date
123AEAMPartial2022-01-16 12:23:28.474000000
123AEAMFull2022-03-01 10:41:15.500000000
123AEAMFull2022-04-15 10:41:15.500000000
123AEAMFull2022-05-26 10:41:15.500000000
123AEAMFull2022-09-20 10:41:15.500000000
123AEAMFull2022-10-05 10:41:15.500000000

期望输出

MIDGroupFile TypeCreate_DateRank
123AEAMPartial2022-01-16 12:23:28.4740000001
123AEAMFull2022-03-01 10:41:15.5000000002
123AEAMFull2022-04-15 10:41:15.5000000002
123AEAMFull2022-05-26 10:41:15.5000000002
123AEAMFull2022-09-20 10:41:15.5000000003
123AEAMFull2022-10-05 10:41:15.5000000003

实现方案(SQL)

这是典型的间隙与岛屿问题,核心是识别分组内的日期连续区间,当相邻日期间隔≥1个月时开启新的Rank,可通过窗口函数实现:

代码示例

WITH date_diff AS (
    SELECT
        MID,
        "Group",
        "File Type",
        Create_Date,
        -- 计算当前日期与组内上一行日期的月份差
        DATEDIFF(month, LAG(Create_Date) OVER (PARTITION BY MID, "Group", "File Type" ORDER BY Create_Date), Create_Date) AS month_gap
    FROM your_table_name
),
group_flags AS (
    SELECT
        *,
        -- 首次行或间隔≥1个月时标记为新组起点
        CASE WHEN month_gap IS NULL OR month_gap >= 1 THEN 1 ELSE 0 END AS is_new_rank
    FROM date_diff
)
SELECT
    MID,
    "Group",
    "File Type",
    Create_Date,
    -- 累加新组标记得到最终Rank
    SUM(is_new_rank) OVER (ORDER BY Create_Date) AS Rank
FROM group_flags
ORDER BY Create_Date;

注意事项

  • 不同数据库的日期差函数语法不同:
    • PostgreSQL 使用 DATE_PART('month', AGE(Create_Date, LAG(Create_Date) ...))
    • Oracle 使用 MONTHS_BETWEEN(Create_Date, LAG(Create_Date) ...)
    • 需根据实际使用的数据库调整日期差计算逻辑。

内容的提问来源于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 03:31:37