使用条件事件创建会话
Creating sessions with conditional events
我有一个网络浏览数据列表,我正在尝试将其转换为会话。
来自用户的示例数据集:
time_millis Type Result
07/10/2015 08:31 1 0
07/10/2015 08:41 1 0
07/10/2015 08:48 2 0
07/10/2015 08:50 2 0
07/10/2015 09:11 2 1
07/10/2015 09:14 3 0
07/10/2015 09:15 1 0
07/10/2015 09:17 1 0
07/10/2015 10:31 1 0
07/10/2015 10:33 1 0
07/10/2015 10:36 1 0
07/10/2015 18:57 1 1
我正在努力实现:
time_millis Type Result Session
07/10/2015 08:31 1 0 1
07/10/2015 08:41 1 0 1
07/10/2015 08:48 2 0 2
07/10/2015 08:50 2 0 2
07/10/2015 09:11 2 1 3
07/10/2015 09:14 3 0 4
07/10/2015 09:15 1 0 4
07/10/2015 09:17 1 0 4
07/10/2015 10:31 1 0 5
07/10/2015 10:33 1 0 5
07/10/2015 10:36 1 0 5
07/10/2015 18:57 1 1 6
我想按每个用户 15 minute
window 对会话进行分区,如果 'Type'
发生变化,我还想创建一个新会话。
我试过使用以下代码,但我认为它的性能不如我上面所希望的那样:
CONDITIONAL_TRUE_EVENT("time_millis" > coalesce(lag("time_millis"), 1)
+ 900000 OR type != LAG(type,1)) OVER (PARTITION BY user ORDER BY
time_millis) AS session_id
您可以将时间分为四个 15 分钟的时间段,并将当前时间段与事件检查中的最后一个时间段进行比较。
将时间截断为分钟,减去时间 mod 15 分钟,将其放入 15 分钟的桶中。最初我想只在一分钟内执行 div 但如果你有一个小时的间隔它就会中断,所以你需要包括完整的时间戳。
TRUNC("time_millis",'MI') - (EXTRACT(MINUTE FROM "time_millis") % 15) * interval '1 minute'
在你的公式中...
CONDITIONAL_TRUE_EVENT("time_millis" > coalesce(lag("time_millis"), 1) + 900000
OR type != LAG(type,1)
OR TRUNC("time_millis",'MI') - (EXTRACT(MINUTE FROM "time_millis") % 15) * interval '1 minute' != TRUNC(LAG("time_millis",1),'MI') - (EXTRACT(MINUTE FROM LAG("time_millis",1)) % 15) * interval '1 minute')
OVER (PARTITION BY user ORDER BY time_millis) AS session_id
另一个 idea 将仅在最后一个事件距当前事件超过 15 分钟时才更改事件。这真的取决于你想做什么,但我认为这也可能有用。获取差异,将纪元(总秒数)divide 提取 60 以得到分钟。
EXTRACT(EPOCH FROM ("time_millis" - LAG("time_millis",1)))/60 > 15
在你的公式中...
CONDITIONAL_TRUE_EVENT("time_millis" > coalesce(lag("time_millis"), 1) + 900000
OR type != LAG(type,1)
OR EXTRACT(EPOCH FROM ("time_millis" - LAG("time_millis",1)))/60 > 15)
OVER (PARTITION BY user ORDER BY time_millis) AS session_id
我有一个网络浏览数据列表,我正在尝试将其转换为会话。
来自用户的示例数据集:
time_millis Type Result
07/10/2015 08:31 1 0
07/10/2015 08:41 1 0
07/10/2015 08:48 2 0
07/10/2015 08:50 2 0
07/10/2015 09:11 2 1
07/10/2015 09:14 3 0
07/10/2015 09:15 1 0
07/10/2015 09:17 1 0
07/10/2015 10:31 1 0
07/10/2015 10:33 1 0
07/10/2015 10:36 1 0
07/10/2015 18:57 1 1
我正在努力实现:
time_millis Type Result Session
07/10/2015 08:31 1 0 1
07/10/2015 08:41 1 0 1
07/10/2015 08:48 2 0 2
07/10/2015 08:50 2 0 2
07/10/2015 09:11 2 1 3
07/10/2015 09:14 3 0 4
07/10/2015 09:15 1 0 4
07/10/2015 09:17 1 0 4
07/10/2015 10:31 1 0 5
07/10/2015 10:33 1 0 5
07/10/2015 10:36 1 0 5
07/10/2015 18:57 1 1 6
我想按每个用户 15 minute
window 对会话进行分区,如果 'Type'
发生变化,我还想创建一个新会话。
我试过使用以下代码,但我认为它的性能不如我上面所希望的那样:
CONDITIONAL_TRUE_EVENT("time_millis" > coalesce(lag("time_millis"), 1)
+ 900000 OR type != LAG(type,1)) OVER (PARTITION BY user ORDER BY
time_millis) AS session_id
您可以将时间分为四个 15 分钟的时间段,并将当前时间段与事件检查中的最后一个时间段进行比较。
将时间截断为分钟,减去时间 mod 15 分钟,将其放入 15 分钟的桶中。最初我想只在一分钟内执行 div 但如果你有一个小时的间隔它就会中断,所以你需要包括完整的时间戳。
TRUNC("time_millis",'MI') - (EXTRACT(MINUTE FROM "time_millis") % 15) * interval '1 minute'
在你的公式中...
CONDITIONAL_TRUE_EVENT("time_millis" > coalesce(lag("time_millis"), 1) + 900000
OR type != LAG(type,1)
OR TRUNC("time_millis",'MI') - (EXTRACT(MINUTE FROM "time_millis") % 15) * interval '1 minute' != TRUNC(LAG("time_millis",1),'MI') - (EXTRACT(MINUTE FROM LAG("time_millis",1)) % 15) * interval '1 minute')
OVER (PARTITION BY user ORDER BY time_millis) AS session_id
另一个 idea 将仅在最后一个事件距当前事件超过 15 分钟时才更改事件。这真的取决于你想做什么,但我认为这也可能有用。获取差异,将纪元(总秒数)divide 提取 60 以得到分钟。
EXTRACT(EPOCH FROM ("time_millis" - LAG("time_millis",1)))/60 > 15
在你的公式中...
CONDITIONAL_TRUE_EVENT("time_millis" > coalesce(lag("time_millis"), 1) + 900000
OR type != LAG(type,1)
OR EXTRACT(EPOCH FROM ("time_millis" - LAG("time_millis",1)))/60 > 15)
OVER (PARTITION BY user ORDER BY time_millis) AS session_id