有条件的LEAD / LAG,无序列保证

贾米

在无法保证满足一定条件的情况下,如何编写有条件的超前/滞后?就我而言,我正在查看网站流量。

样本数据(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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

有条件的数字序列

来自分类Dev

有条件地忽略属性序列化

来自分类Dev

有条件的序列数填写R

来自分类Dev

R-有条件的日期序列

来自分类Dev

有条件地序列化/反序列化属性

来自分类Dev

Scala:将项目添加到序列中或有条件地合并序列

来自分类Dev

GSON fromJSON反序列化,带有条件以排除特定对象实例

来自分类Dev

使用杰克逊序列化时有条件地跳过对象

来自分类Dev

活动模型序列化器-如何有条件地包含属性?滑轨

来自分类Dev

Jackson定制JsonSerializer-有条件地调用默认序列化器

来自分类Dev

有条件的数字序列(续)。数据表解决方案?

来自分类Dev

是否可以有条件地序列化CDATA?

来自分类Dev

如何在有条件的JavaScript中生成随机数字序列?

来自分类Dev

F# 迭代对象序列并根据属性有条件地聚合

来自分类Dev

如何从这本有条件的字典中获取排序列表?

来自分类Dev

有条件地阻止 Django 加入链式序列化程序

来自分类Dev

有没有办法根据属性有条件地序列化 C# 列表对象?

来自分类Dev

有条件的

来自分类Dev

有条件的

来自分类Dev

有条件的将换行符插入数字序列(最好使用bash,awk或sed)

来自分类Dev

如何在使用JSON.Net进行序列化期间有条件地忽略字段和属性?

来自分类Dev

如何基于另一个JSON属性有条件地反序列化JSON对象?

来自分类Dev

有条件的失败的有条件的执行

来自分类Dev

有条件的等待

来自分类Dev

有条件的承诺

来自分类Dev

有条件的@Autowired?

来自分类Dev

MAX(有条件)

来自分类Dev

有条件的AppAssets

来自分类Dev

有条件的订单