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

时间:2013-09-13 20:12:16

标签: sql sas proc-sql

我有一些关于人们收听收音机的时间,时长和频道的数据。我需要创建一个名为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_time(如果从晚上11点到第二天早晨,则为日期),以便如果entry_time + duration +(5minutes)< entry_time(下一个频道)然后会话改变。这已经杀了我,简单的数组不会做这个技巧,或者我使用数组的尝试没有用。提前致谢

以下代码运行良好,但在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;

1 个答案:

答案 0 :(得分:1)

if first.account_number then session=1; *(or first.id or whatever...);

您只需要重新初始化每个新ID。 (您可能需要更频繁地初始化 - 比如每个频道)。我不确定您的示例数据如何与您的代码相关联,因此您可能需要修改BY语句以正确反映它。有关示例信息,您需要

by id channel;

至少 - 所以你可以说

if first.channel then session=1;

因为看起来你需要重置每个频道。