这是一个令人惊讶的棘手问题,因为必须将每行与每个其他行进行比较以获得相同的ID来检查重叠,如果存在多个重叠,则必须非常小心,不要对它们进行重复计算。
这是一个基于哈希的解决方案 - 这个想法是建立一个哈希,其中包含一个成员在你去的时候留下的所有个别日子,然后在最后计算其中的项目数:
data want; length day 8; if _n_ = 1 then do; declare hash h(); rc = h.definekey('day'); rc = h.definedone(); end; do until(last.id); set have; by id; do day = entered to left - 1; rc = h.add(); end; end; total_days = h.num_items; rc = h.clear(); keep id total_days; run;
这应该在内存上相当轻,因为它只需要一次加载1个id的天数。