Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 为每个id创建唯一的会话变量_Sql_Sas_Proc Sql - Fatal编程技术网

Sql 为每个id创建唯一的会话变量

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

我有一些关于人们收听广播的时间、时间和频道的数据。我需要创建一个名为sessions的变量,该变量将收音机打开时出现的所有条目分组。因为数据可能包含一些错误,我想说,如果从一个通道周期结束到下一个通道周期结束的时间少于五分钟,那么它仍然是同一个会话。希望有一个简单的例子可以澄清

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分钟) 下面的代码运行良好,但在id更改时不会重新启动会话

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
,因为它使代码更难阅读。