zoukankan      html  css  js  c++  java
  • 89

    1 LEAD
    与LAG相反,LEAD(col,n,DEFAULT) 用于统计窗口内往下第n行值

    参数1为列名,参数2为往下第n行(可选,默认为1),参数3为默认值(当往下第n行为NULL时候,取默认值,如不指定,则为NULL)

    场景
    用户Peter在浏览网页,在某个时刻,Peter点进了某个页面,过一段时间后,Peter又进入了另外一个页面,如此反复,那怎么去统计Peter在某个特定网页的停留时间呢,又或是怎么统计某个网页用户停留的总时间呢?

    create table test.user_log(
    userid string,
    time string,
    url string
    ) row format delimited fields terminated by ‘ ’;
    使用load命令将如下测试数据导入:

    Peter 2015-10-12 01:10:00 url1
    Peter 2015-10-12 01:15:10 url2
    Peter 2015-10-12 01:16:40 url3
    Peter 2015-10-12 02:13:00 url4
    Peter 2015-10-12 03:14:30 url5
    Marry 2015-11-12 01:10:00 url1
    Marry 2015-11-12 01:15:10 url2
    Marry 2015-11-12 01:16:40 url3
    Marry 2015-11-12 02:13:00 url4
    Marry 2015-11-12 03:14:30 url5
    数据说明:Peter 2015-10-12 01:10:00 url1 ,表示Peter在2015-10-12 01:10:00进入了网页url2,即记录的是进入网页的时间。

    分析
    要计算Peter在页面url1停留的时间,需要用进入页面url2的时间,减去进入url1的时间,即2015-10-12 01:15:10这个时间既是离开页面url1的时间,也是开始进入页面url2的时间。

    获取用户在某个页面停留的起始与结束时间:

    select userid,
    time stime,
    lead(time) over(partition by userid order by time) etime,
    url
    from test.user_log;
    stime就是进入页面时间,etime就是离开页面时间,结果是这样的:

    Marry 2015-11-12 01:10:00 2015-11-12 01:15:10 url1
    Marry 2015-11-12 01:15:10 2015-11-12 01:16:40 url2
    Marry 2015-11-12 01:16:40 2015-11-12 02:13:00 url3
    Marry 2015-11-12 02:13:00 2015-11-12 03:14:30 url4
    Marry 2015-11-12 03:14:30 NULL url5
    Peter 2015-10-12 01:10:00 2015-10-12 01:15:10 url1
    Peter 2015-10-12 01:15:10 2015-10-12 01:16:40 url2
    Peter 2015-10-12 01:16:40 2015-10-12 02:13:00 url3
    Peter 2015-10-12 02:13:00 2015-10-12 03:14:30 url4
    Peter 2015-10-12 03:14:30 NULL url5
    用etime减去stime,然后按照用户分组累加就是,每个用户访问的总时间了。

    select userid,
    time stime,
    lead(time) over(partition by userid order by time) etime,
    UNIX_TIMESTAMP(lead(time) over(partition by userid order by time),‘yyyy-MM-dd HH:mm:ss’)- UNIX_TIMESTAMP(time,‘yyyy-MM-dd HH:mm:ss’) period,
    url
    from test.user_log;
    这里展示出了stime(开始时间),etime(离开时间),period(停留时长),url(页面地址),结果:

    Marry 2015-11-12 01:10:00 2015-11-12 01:15:10 310 url1
    Marry 2015-11-12 01:15:10 2015-11-12 01:16:40 90 url2
    Marry 2015-11-12 01:16:40 2015-11-12 02:13:00 3380 url3
    Marry 2015-11-12 02:13:00 2015-11-12 03:14:30 3690 url4
    Marry 2015-11-12 03:14:30 NULL NULL url5
    Peter 2015-10-12 01:10:00 2015-10-12 01:15:10 310 url1
    Peter 2015-10-12 01:15:10 2015-10-12 01:16:40 90 url2
    Peter 2015-10-12 01:16:40 2015-10-12 02:13:00 3380 url3
    Peter 2015-10-12 02:13:00 2015-10-12 03:14:30 3690 url4
    Peter 2015-10-12 03:14:30 NULL NULL url5
    这里有空的情况,也就是没有获取到离开时间,这要看实际业务怎么定义了,如果算到23点,太长了。
    2 Lag
    LAG(col,n,DEFAULT) 用于统计窗口内往上第n行值第一个参数为列名,第二个参数为往上第n行(可选,默认为1),第三个参数为默认值(当往上第n行为NULL时候,取默认值,如不指定,则为NULL)可以用来做一些时间的维护,如上一次登录时间。

    场景
    用户Peter在浏览网页,在某个时刻,Peter点进了某个页面,过一段时间后,Peter又进入了另外一个页面,如此反复,那怎么去统计Peter在某个特定网页的停留时间呢,又或是怎么统计某个网页用户停留的总时间呢?

    create table test.user_log(
    userid string,
    time string,
    url string
    ) row format delimited fields terminated by ‘ ’;
    使用load命令将如下测试数据导入:

    Peter 2015-10-12 01:10:00 url1
    Peter 2015-10-12 01:15:10 url2
    Peter 2015-10-12 01:16:40 url3
    Peter 2015-10-12 02:13:00 url4
    Peter 2015-10-12 03:14:30 url5
    Marry 2015-11-12 01:10:00 url1
    Marry 2015-11-12 01:15:10 url2
    Marry 2015-11-12 01:16:40 url3
    Marry 2015-11-12 02:13:00 url4
    Marry 2015-11-12 03:14:30 url5
    数据说明:Peter 2015-10-12 01:10:00 url1 ,表示Peter在2015-10-12 01:10:00进入了网页url2,即记录的是进入网页的时间。

    select userid,
    time etime,
    lag(time, 1, ‘1970-01-01 00:00:00’) over(partition by userid order by time) stime,
    url
    from test.user_log;
    这里etime是结束时间,stime是开始时间,结果:

    Marry 2015-11-12 01:10:00 1970-01-01 00:00:00 url1
    Marry 2015-11-12 01:15:10 2015-11-12 01:10:00 url2
    Marry 2015-11-12 01:16:40 2015-11-12 01:15:10 url3
    Marry 2015-11-12 02:13:00 2015-11-12 01:16:40 url4
    Marry 2015-11-12 03:14:30 2015-11-12 02:13:00 url5
    Peter 2015-10-12 01:10:00 1970-01-01 00:00:00 url1
    Peter 2015-10-12 01:15:10 2015-10-12 01:10:00 url2
    Peter 2015-10-12 01:16:40 2015-10-12 01:15:10 url3
    Peter 2015-10-12 02:13:00 2015-10-12 01:16:40 url4
    Peter 2015-10-12 03:14:30 2015-10-12 02:13:00 url5
    计算总时间,只需要用结束时间 - 开始时间,然后分组累加即可。

    select userid,
    UNIX_TIMESTAMP(time, ‘yyyy-MM-dd HH:mm:ss’) -
    UNIX_TIMESTAMP(lag(time, 1, ‘1970-01-01 00:00:00’) over(partition by userid order by time), ‘yyyy-MM-dd HH:mm:ss’),
    url
    from test.user_log;
    结果

    Marry 1447290600 url1
    Marry 310 url2
    Marry 90 url3
    Marry 3380 url4
    Marry 3690 url5
    Peter 1444612200 url1
    Peter 310 url2
    Peter 90 url3
    Peter 3380 url4
    Peter 3690 url5

  • 相关阅读:
    《Linux shell编程中 diff与vimdif的使用》RHEL6
    《mysql数据库备份小脚本》
    《linux下sudo服务的使用》RHEL6
    《通过脚本查看哪些ip被占用》shell笔记
    linux系统环境变量.bash_profile/bashrc文件
    清空系统日志shell scripts——自学笔记
    《linux源代码包的编译安装》RHEL6
    《linux 网卡别名的添加和绑定》RHEL6
    《iptables详解 》RHEL6
    转:swagger 入门
  • 原文地址:https://www.cnblogs.com/gd11/p/14227800.html
Copyright © 2011-2022 走看看