机顶盒数据首尾对应(下一条记录的结束时间作为下一条记录的开始时间) 未完

从20号就开始感冒,然后发烧38.5℃。是真的难受啊,浑身酸痛,两眼发热,只能躺床上喝水。决心病好好了之后加强锻炼,不然太耽误事了。

之前的SQL坑要填上。秋招马上就要开始了,既然生病好了就要振作起来。下面总结下前段时间学到的SQL技巧。

============================================================================

我在做的过程中发现了自己的一个问题。我用ROW_NUMBER()将一名用户的全天收视记录按时间排序,编号。但是忽略了该用户中间还会关机和开机,但是在我这种统计方式下就没有显示出来。下面观察一条记录


下一条记录的开始时间等于上一条记录的结束时间表示这个收看行为是连续的,否则就是有关机行为,如下:


所以如何分辨是否关机就是关键,找到类似的一个案例做参考。

案例

1.获取上一条记录的截止日期当做下一条记录的结束日期?

1.原始表数据如下:
ID          eid         badge          effectdate
----------- ----------- -------------------- -----------------------
23          72          00000001       2013-11-09 00:00:00
24          72          00000001       2013-12-01 00:00:00
25          72          00000001       2013-12-05 00:00:00

想通过SQL,变成..(就是说,下一行的effectdate就是上一列的enddate)
ID          eid         badge          effectdate               ENDDATE
----------- ----------- -------------------- --------------------------------------
23          72          00000001       2013-11-09 00:00:00     2013-12-01 00:00:00 
24          72          00000001       2013-12-01 00:00:00     2013-12-05 00:00:00

25          72          00000001       2013-12-05 00:00:00     null

根据各位大神的解答https://bbs.csdn.net/topics/390665460?page=1,我把这个方法用到了电视台数据上面。

各位大神给出了两种种方法,简单总结下:

1.二次引用

create table huang(ID int,eid int,badge varchar(8),effectdate TIMESTAMP);
insert into huang values(23,72,'00000001','2013-11-09 00:00:00');
insert into huang values(24,72,'00000001','2013-12-01 00:00:00');
insert into huang values(25,72,'00000001','2013-12-05 00:00:00');

BUT,当我运行SELECT effectdate FROM huang a WHERE a.id > huang.id,报错


这样引用是错误的。刚好我6/25号的时候学了PG中的LATERAL(),可以引用外部表,→点击打开链接


但是这样存在一个问题,25号没有了。。。。

2. LEFT JOIN 和RANGK + 1 


我最后得到的结果











PS:导入表的时候一定要提前设置好数据类型,而且要统一各个表的数据类型,否则在UNION ALL的时候会报错




猜你喜欢

转载自blog.csdn.net/dufemt/article/details/80792270