在mysql,数据如下:
#查询某一用户该日抽奖时间
select draw_time from user_draw_log where user_id = 1 and draw_date='2016-03-09' order by id;
+---------------------+
| draw_time |
+---------------------+
| 2016-03-09 13:52:46 |
| 2016-03-09 13:52:53 |
| 2016-03-09 13:53:01 |
| 2016-03-09 13:53:13 |
| 2016-03-09 13:53:25 |
...

想计算每次抽奖时间之间的间隔 以便判断是否是并发插入 我的方法如下使用一个临时变量记录前一次的抽奖时间

select draw_time, timediff(draw_time,@prev_time) diff,(@prev_time:=draw_time) from user_draw_log where user_id = 1 and draw_date='2016-03-09' order by id;
+---------------------+------------------+-------------------------+
| draw_time | diff | (@prev_time:=draw_time) |
+---------------------+------------------+-------------------------+
| 2016-03-09 13:52:46 | -00:08:28.000000 | 2016-03-09 13:52:46 |
| 2016-03-09 13:52:53 | 00:00:07.000000 | 2016-03-09 13:52:53 |
| 2016-03-09 13:53:01 | 00:00:08.000000 | 2016-03-09 13:53:01 |
| 2016-03-09 13:53:13 | 00:00:12.000000 | 2016-03-09 13:53:13 |
| 2016-03-09 13:53:25 | 00:00:12.000000 | 2016-03-09 13:53:25 |
| 2016-03-09 13:53:32 | 00:00:07.000000 | 2016-03-09 13:53:32 |
| 2016-03-09 13:53:38 | 00:00:06.000000 | 2016-03-09 13:53:38 |
...

有没更方便的方法实现这一功能呢?对所有用户都求相邻记录时间差该如何操作?

hive做法如下:

1.Hive row_number() 函数的高级用法 row_num 按照某个字段分区显示第几条数据

select imei,ts,fuel_instant,gps_longitude,gps_latitude,row_number() over (PARTITION BY imei ORDER BY ts ASC) as row_num from sample_data_2

2.row_num 是相互连续的,join 自身,然后时间相减可求差
create table obd_20140101 as

  select a.imei,a.row_num,a.ts,COALESCE(unix_timestamp(a.ts, 'yyyy-MM-dd HH:mm:ss.S'), 0) - unix_timestamp(b.ts, 'yyyy-MM-dd HH:mm:ss.S') as intervel ,a.fuel_instant,a.gps_speed as obd_speed,a.gps_status,a.gps_longitude,a.gps_latitude,a.direct_angle,a.obdspeed from obddata_20140101 a join obddata_20140101 b on a.imei = b.imei and a.row_num = b.row_num +1

事实上该方法有更加简便的方法,那就是hive的分析窗口函数:

create table obd_20140101 as

select imei,ts as ts1,fuel_instant,gps_longitude,gps_latitude,lead(ts,1,ts) over  (PARTITION BY imei ORDER BY ts ASC)  as ts2 from sample_data_2;

这样,数据会按imei分组,并按时间排序。接下来的时间相减就简单了。

select a.imei,a.row_num,a.ts,COALESCE(unix_timestamp(a.ts1, 'yyyy-MM-dd HH:mm:ss.S'), 0) - unix_timestamp(a.ts2, 'yyyy-MM-dd HH:mm:ss.S') as intervel ,a.fuel_instant,a.gps_speed as obd_speed,a.gps_status,a.gps_longitude,a.gps_latitude,a.direct_angle,a.obdspeed from obddata_20140101 a;

hive实现根据用户分组,按用户记录求上下两条记录的时间差的更多相关文章

  1. SQLServer 分组查询相邻两条记录的时间差

    原文:SQLServer 分组查询相邻两条记录的时间差 首先,我们通过数据库中表的两条记录来引出问题,如下图 以上为一个记录操作记录的表数据.OrderID为自增长列,后面依次为操作类型,操作时间,操 ...

  2. SQL获取分组后取某字段最大一条记录(求每个类别中最大的值的列表)

    获取分组后取某字段最大一条记录 方法一:(效率最高) select * from test as a where typeindex = (select max(b.typeindex) from t ...

  3. sqlserver -- 学习笔记(七)获取同组数据的前两条记录

    不啰嗦,直接上图,大概实现效果如下: 有上面这样一份数据,将他们按照userAccount和submitTime进行分组,然后提前每组数据的前两条记录 提取后数据如下: 实现的SQL如下: selec ...

  4. Slq怎么样获取首条记录和最后一条记录

    sql如何查询表的第一条记录和最后一条记录 方法一:使用top select TOP 1 * from apple;TOP 1 表示表apple中的第一条数据 select TOP 1 * from ...

  5. SQL查找TCar表中同一辆车前后两条记录的CarId,两条记录中有多个字段值一样

    查询同一个表中某一字段值相同的记录 select * from 表名 where 字段 in(select 字段 from 表名 group by 字段 having count(1)>1) s ...

  6. HIve分组查询返回每组的一条记录

    select a.lng,a.lat from (select row_number() over ( partition by uid,grid_id) as rnum,weighted_centr ...

  7. 记一次有意思的 SQL 实现 → 分组后取每组的第一条记录

    开心一刻 今天,朋友气冲冲的走到我面前 朋友:我不是谈了个女朋友,谈了三个月嘛,昨天我偷看她手机,你猜她给我备注什么 我:备注什么? 朋友:舔狗 2 号! 我一听,气就上来了,说道:走,找她去,这婆娘 ...

  8. [mysql] 先按某字段分组再取每组中前N条记录

    From: http://blog.chinaunix.net/uid-26729093-id-4294287.html 请参考:http://bbs.csdn.net/topics/33002126 ...

  9. sql查询上一条记录和下一条记录

    上一条记录的SQL语句: * from news where newsid<id order by newsid DESC 下一条记录的SQL语句: * from news where news ...

随机推荐

  1. Jedis使用工具类

    Redis 使用工具类: package com.qlwb.business.common.redis; import org.apache.log4j.Logger; import redis.cl ...

  2. swift第一课快速体验playground

    最近听说苹果要大力推行swift语言,所以我必须要赶快好好学一学,今天做第一个就遇到问题. 在Xcode7.2欢迎界面,选中创建第一个,我们一般都是默认创建第二个. 创建完后,出现问题了,提示如下: ...

  3. #include< >和#include“ ”的区别

    < >引用的是编译器的类库路径里面的头文件 " "引用的是你程序目录的相对路径中的头文件 假如你编译器定义的自带头文件引用在C:\Keil\c51\INC\下面 则#i ...

  4. [荐]推荐一个shell学习的网站

    最近再用shell脚本,发现一个脚本学习的网站,非常好用,特此推荐一下. shell学习网站链接:http://c.biancheng.net/cpp/shell/

  5. Eucalyptus(v4.0)系统需求

    1.计算需求 Physical Machines: All Eucalyptus components must be installed on physical machines, not virt ...

  6. aar、jar、so的引入和aar打包包含so、aar、jar文件

    so依赖   1,先建本地仓库,指向so放置的目录

  7. python基础-三元运算和bytes数据

    三元运算       进制 二进制,01 八进制,01234567 十进制,0123456789 十六进制,0123456789ABCDEF   bytes类型 http://www.cnblogs. ...

  8. GBase数据库存储过程——批量查询多个数据表的磁盘占用情况

    --清理历史表,可选 DROP TABLE IF EXISTS `dap_model`.`data_statics`; CREATE TABLE `dba`.`data_statics` ( `TAB ...

  9. JQuery笔录

    1.jQuery 的 hide() 函数,隐藏了 HTML 文档中所有的 <p> 元素.<script type="text/javascript">$(d ...

  10. Redis(5.0.0)持久化AOF和 RDB 结合源码分析

    主要是挖个坑.候补(代码还没看完..) https://github.com/antirez/redis/tree/5.0 一.Redis保存持久化文件 二.Redis启动加载持久化文件 src/se ...