Sql 为每个id创建唯一的会话变量
我有一些关于人们收听广播的时间、时间和频道的数据。我需要创建一个名为sessions的变量,该变量将收音机打开时出现的所有条目分组。因为数据可能包含一些错误,我想说,如果从一个通道周期结束到下一个通道周期结束的时间少于五分钟,那么它仍然是同一个会话。希望有一个简单的例子可以澄清Sql 为每个id创建唯一的会话变量,sql,sas,proc-sql,Sql,Sas,Proc Sql,我有一些关于人们收听广播的时间、时间和频道的数据。我需要创建一个名为sessions的变量,该变量将收音机打开时出现的所有条目分组。因为数据可能包含一些错误,我想说,如果从一个通道周期结束到下一个通道周期结束的时间少于五分钟,那么它仍然是同一个会话。希望有一个简单的例子可以澄清 id obs Entry_date Entry_time duration(in secs) channel 1 1 01/01/12 23:25:21 6000
id obs Entry_date Entry_time duration(in secs) channel
1 1 01/01/12 23:25:21 6000 2
1 2 01/03/12 01:05:64 300 5
1 3 01/05/12 12:12:35 456 5
2 4 01/05/12 16:45:21 657 8
我想创建变量会话,以便
id obs Entry_date Entry_time duration(in secs) channel session
1 1 01/01/12 23:25:21 6000 2 1
1 2 01/03/12 01:05:64 300 5 1
1 3 01/05/12 12:12:35 456 5 2
2 4 01/05/12 16:45:21 657 8 1
为了定义1个会话,我需要使用entry_时间(如果从晚上11点到第二天早上,则使用日期),以便如果entry_时间+持续时间+(5分钟)data sirius1; /*creates sessions*/
set sirius;
by account_number entry_date_est entry_time_est; /* put in to check data is sorted correctly */
retain session 1; /* initialise session with value 1 */
session+(dif(dhms(entry_date_est,0,0,entry_time_est))-lag(duration_seconds)>300); /* increment session by 1 if time difference > 5 minutes */
run;
您只需要在每个新ID处重新初始化(您可能需要更频繁地初始化,就像每个通道一样)。我不确定示例数据与代码之间的关系,因此您可能需要修改BY语句以正确反映它。对于示例信息,您需要
by id channel;
至少,你可以这么说
if first.channel then session=1;
看起来您需要为每个通道重置
您只需要在每个新ID处重新初始化(您可能需要更频繁地初始化,就像每个通道一样)。我不确定示例数据与代码之间的关系,因此您可能需要修改BY语句以正确反映它。对于示例信息,您需要
by id channel;
至少,你可以这么说
if first.channel then session=1;
看起来您需要为每个频道重置。再次感谢joe。在我之前的尝试中,我一直在错误的位置使用if-then语句,因为正在使用DIF和LAG函数,所以在id更改时使用IFN重置会话更安全。会话=ifn(第一次会话,1,(dif(dhms(输入日期,0,0,输入时间))-延迟(持续时间,秒)>300));不,那没什么区别。只要
滞后
不在if
块内,它就是相同的。我不希望有如此复杂的ifn
,因为它使代码更难阅读。再次感谢joe。在我之前的尝试中,我一直在错误的位置使用if-then语句,因为正在使用DIF和LAG函数,所以在id更改时使用IFN重置会话更安全。会话=ifn(第一次会话,1,(dif(dhms(输入日期,0,0,输入时间))-延迟(持续时间,秒)>300));不,那没什么区别。只要滞后
不在if
块内,它就是相同的。我宁愿不要那种复杂的ifn
,因为它使代码更难阅读。