Sql 确定4个连续观测值
我是SAS的新手,非常感谢您的指导。我已经创建了一个数千个观察数据集,在这个数据集中,我需要通过两个字段(person、clerk)来识别4个连续的、每月发生的实例。即:“在13个月内连续4个月与人有联系的职员” 在准备过程中,我已经为每年的每个月(即2016.01、2019.02)分配了一个INT值,指示其在我关心的13个月时间跨度内的位置 下面是一个模拟示例: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
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背景;它引起共鸣。