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

R data.table按人员分组为重叠日期区间新增最大起止日期列

问题根因

你当前的代码仅按人员ID(prs_nat_key/person_id)单维度分组,因此只会取该人员全量记录中最大days_diff对应的第一组日期,没有预先对同一个人员下的不重叠服务区间做拆分分组,所以导致所有行返回相同的起止日期。

解决代码

你需要先对同一个人员的所有记录做重叠区间合并分组,再按「人员ID+区间分组ID」双维度分组计算两个目标列,完整实现代码如下:

library(data.table)
library(lubridate)

# 1. 先按人员ID、服务开始日期排序,保证区间判断逻辑正确
setorder(ex, person_id, serv_from_dt)

# 2. 为每个人员生成不重叠区间的分组ID
ex[, group_id := cumsum(serv_from_dt > shift(cummax(serv_to_dt), fill = first(serv_to_dt) - 1)), by = person_id]

# 3. 按人员ID+区间分组ID双维度分组,取当前区间内最大days_diff对应的起止日期
ex[, `:=`(
  max_start_date = serv_from_dt[which.max(days_diff)],
  max_end_date = serv_to_dt[which.max(days_diff)]
), by = .(person_id, group_id)]

# 可选:删除中间生成的辅助列group_id
ex[, group_id := NULL]

逻辑说明

  • 区间分组逻辑:通过cummax(serv_to_dt)计算截至当前行的最大服务结束日期,若当前行的服务开始日期大于之前所有行的最大服务结束日期,则判定为新的不重叠区间,用cumsum累加生成唯一的分组ID
  • 分组计算逻辑:同一个不重叠区间内的所有行共享同一个max_start_date和max_end_date,取区间内days_diff最大值对应的起止日期即可
  • 如果你实际业务中的人员ID列名是prs_nat_key,把代码里的person_id替换为对应列名即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 21:57:04