Sql 确定4个连续观测值

Sql 确定4个连续观测值,sql,sas,proc,Sql,Sas,Proc,我是SAS的新手,非常感谢您的指导。我已经创建了一个数千个观察数据集,在这个数据集中,我需要通过两个字段(person、clerk)来识别4个连续的、每月发生的实例。即:“在13个月内连续4个月与人有联系的职员” 在准备过程中,我已经为每年的每个月(即2016.01、2019.02)分配了一个INT值,指示其在我关心的13个月时间跨度内的位置 下面是一个模拟示例: PersonID ClerkID monthINT 123456 789415 1 123456

我是SAS的新手,非常感谢您的指导。我已经创建了一个数千个观察数据集,在这个数据集中,我需要通过两个字段(person、clerk)来识别4个连续的、每月发生的实例。即:“在13个月内连续4个月与人有联系的职员”

在准备过程中,我已经为每年的每个月(即2016.01、2019.02)分配了一个INT值,指示其在我关心的13个月时间跨度内的位置

下面是一个模拟示例:

PersonID    ClerkID monthINT
123456          789415  1
123456          789415  2
123456          789415  3
123456          789415  4
123456          789415  6
123456          789415  8
123456          789415  10
123456          789415  11
123456          789415  12
123456          789415  13

您可以使用
SQL
通过自联接获得所需的结果集

each.monthId和each.monthId-3之间的联接条件
self.monthInt
查找间隔为4个月的候选项,having条件
count(distinct each.monthInt)=4
确保候选项间隔内每个月的交互

select self.PersonId, self.ClerkID, max(self.monthInt) as monthOf4thInteraction
from 
  have as self
join 
  have as each
on 
  self.PersonId = each.PersonId and
  self.ClerkId = each.ClerkId and
  self.monthInt between each.monthId and each.monthId-3
group by 
  self.PersonId, self.ClerkId, self.monthInt
having count (distinct each.monthId) = 4

只要保持连续计数。当您点击一个新id或点击一个间隙时,重置计数

data want;
  set have ;
  by PersonID ClerkID monthINT ;
  if monthint-1=lag(monthint) and not first.clerkid then run_length+1;
  else run_length=1;
  flag = run_length >= 4;
run;
结果:

       Person     Clerk    month     run_
Obs      ID        ID       INT     length    flag

  1    123456    789415       1        1        0
  2    123456    789415       2        2        0
  3    123456    789415       3        3        0
  4    123456    789415       4        4        1
  5    123456    789415       6        1        0
  6    123456    789415       8        1        0
  7    123456    789415      10        1        0
  8    123456    789415      11        2        0
  9    123456    789415      12        3        0
 10    123456    789415      13        4        1

提示:
data
使用
retain
进行步进。您不需要指定要作为输出的内容。这里的示例应该能让您很好地了解您需要什么,但是如果您有日期变量,也可以查看DIF()或INTCK()函数。感谢您的查看,并为没有包含所需结果的详细信息而道歉。因为我的目标是根据4个连续的标准来鉴定记录,所以我想相应地标记这些记录。例如,我的模拟数据集中的第四条也是最后一条记录描述了满足以下条件的记录:4个连续实例。显示“Y”指示器的“结果”字段绝对足够。如何处理多个匹配?id职员1在13个月内每个月都与个人1连接?数据集由13个月内与多个职员匹配的多个个人组成。每个PersonID ClerkID匹配都是独一无二的,按月份划分。我研究了超前和滞后函数作为解的方法。这是一个完美的解。谢谢你分享你的时间和技能。谢谢!与上面的一样,这是一个完美的解决方案,来自SQL背景;它引起共鸣。