在无法保证满足一定条件的情况下,如何编写有条件的超前/滞后?就我而言,我正在查看网站流量。
样本数据(prior_path和prior_event是我的目标字段,在给定条件的情况下,我很难到达prior_event)
+-----------+-----+-------+---------------------------------------+-------+------------------------------------+-------------+
| sessionid | hit | type | path | event | prior_path | prior_event |
+-----------+-----+-------+---------------------------------------+-------+------------------------------------+-------------+
| 1001 | 1 | event | www.stackoverflow.com | hover | | |
| 1001 | 2 | page | www.stackoverflow.com | | | hover |
| 1001 | 3 | event | www.stackoverflow.com | load | | |
| 1001 | 4 | event | www.stackoverflow.com | blur | | load |
| 1001 | 5 | event | www.stackoverflow.com | click | | blur |
| 1001 | 6 | page | www.stackoverflow.com/post/10 | | www.stackoverflow.com | click |
| 1001 | 7 | event | www.stackoverflow.com/post/10#details | offer | | |
| 1001 | 8 | page | www.stackoverflow.com/post/confirm | | www.stackoverflow.com/post/10 | offer |
| 1001 | 9 | page | www.stackoverflow.com/questions/10 | | www.stackoverflow.com/post/confirm | offer |
| 1001 | 10 | event | www.stackoverflow.com/questions/10 | exit | | |
+-----------+-----+-------+---------------------------------------+-------+------------------------------------+-------------+
previous_path:最后一个路径,其中type =仅用于页面匹配类型的页面priority_event:最后一个事件,其type =针对所有匹配类型的事件
请注意,命中8和9,“要约”事件被重复,因为那些事件导致了这些页面。
尽我所能,prior_path似乎很简单
SELECT LAG(path) OVER (PARTITION BY sessionid, type ORDER BY hit) FROM my_table
但我不确定如何获取prior_event。
您已经有了正确的表达方式prior_path
。您只需要将其包装在条件表达式中即可。
至于prior_event
,确实确实有点复杂。我建议采用以下方法:
对于事件,我们可以使用 lag()
对于页面,一种选择是使用一些“间隔和离岛”技术:首先使用条件总和定义组,该总和在每次遇到事件时都会增加,然后使用first_value()
:
这应该做您想要的:
select
t.*,
case when type = 'page'
then lag(path) over(partition by sessionid, type order by hit)
end prior_path,
case type
when 'page'
then first_value(event) over(partition by sessionid, grp order by hit)
when 'event'
then lag(event) over(partition by sessionid order by hit)
end prior_event
from (
select
t.*,
sum(case when type = 'event' then 1 else 0 end)
over(partition by sessionid order by hit) grp
from mytable t
) t
DB Fiddle上的演示(由于野外缺少蜂巢小提琴,我使用了Postgres-但这也适用于Hive):
sessionid | 命中| 类型 路径 事件 grp | 优先路径| 事前事件 --------:| -:| :---- | :------------------------------------ | :---- | -:| :--------------------------------- | :---------- 1001 | 1 | 事件 www.stackoverflow.com | 悬停| 1 | 空 | 空 1001 | 2 | 页面 www.stackoverflow.com | 空 | 1 | 空 | 悬停 1001 | 3 | 事件 www.stackoverflow.com | 加载| 2 | 空 | 空值 1001 | 4 | 事件 www.stackoverflow.com | 模糊 3 | 空 | 载重 1001 | 5 | 事件 www.stackoverflow.com | 点击| 4 | 空 | 模糊 1001 6 | 页面 www.stackoverflow.com/post/10 | 空 | 4 | www.stackoverflow.com | 点击 1001 | 7 | 事件 www.stackoverflow.com/post/10#details | 报价 5 | 空 | 空 1001 | 8 | 页面 www.stackoverflow.com/post/confirm | 空 | 5 | www.stackoverflow.com/post/10 | 提供 1001 | 9 | 页面 www.stackoverflow.com/questions/10 | 空 | 5 | www.stackoverflow.com/post/confirm | 报价 1001 | 10 | 事件 www.stackoverflow.com/questions/10 | 退出 6 | 空 | 空值
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句