q/kdb+中如何按±1天日期偏差分组生成uniqueid
解决方案:为存在生日±1天偏差的儿童生成统一UniqueID
核心思路
先按dadname和mumname分组,在每组内将相差≤1天的childdob归为同一簇,再为每个簇分配唯一ID,最终映射回原表生成uniqueid列。
具体实现代码
1. 定义日期聚类函数
该函数将一组日期中相差≤1天的日期聚合成同一簇:
clusterDates:{ if[count x=0; enlist enlist x]; sorted:asc x; diffs:1_deltas sorted; splits:where diffs>1; if[count splits=0; enlist sorted]; raze {sorted[x+1 y]} each (0,-1_splits) cross (1,1+splits - 1_0,splits)}
2. 生成日期到UniqueID的映射表
对每个dadname,mumname组内的日期簇分配唯一ID:
// 单组内生成日期-ID映射 dateMap:{[g] dates:exec distinct childdob from g; clusters:clusterDates dates; idMap:raze {[c;i] (c)!enlist i} each clusters til count clusters; idMap} // 全局分组处理,得到所有日期的映射 grouped:group peopletb by dadname,mumname; allMaps:raze dateMap each grouped;
3. 为原表添加uniqueid列
将映射关系应用到原表:
peopletb:update uniqueid:allMaps[childdob] by dadname,mumname from peopletb
效果验证
执行后查看表,以下两组会拥有相同的uniqueid:
mike rachel 2007.02.05、mike rachel 2007.02.06francis anne 2007.04.12、francis anne 2007.04.13
内容的提问来源于stack exchange,提问作者bashprofile84
相关产品推荐
相关产品推荐

