获取当前和上一次记录 获取当前和上一次记录

vbasten 2014-06-01 02:54:17
表T记录旅客一年乘坐交通工具的情况,每天都会更新数据如下:
旅客姓名 日期 当前交通工具
张三 2014-01-02 火车
张三 2014-03-25 汽车
李四 2014-02-06 飞机
李四 2014-03-25 火车
张三 2014-04-05 飞机
李四 2014-03-29 轮船


现在想获取某人每次乘坐交通工具的信息统计,具体有4列:
旅客姓名 日期 当前交通工具 上次交通工具
张三 2014-01-02 火车
张三 2014-03-25 汽车 火车
李四 2014-02-06 飞机
李四 2014-03-25 火车 飞机
张三 2014-04-05 飞机 汽车
李四 2014-03-29 轮船 火车

现在每天会定时抽取前一天的数据,会先放入一个临时表,然后处理这些信息,包括上面的需求。整个处理完毕会插入到正式的统计表里。
针对上面的需求,现在的做法是对每天新增加的记录里旅客,循环去看之前的每一天的乘坐情况,(有个起点日期)如果发现那一天该旅客出行了,就会更新 上次交通工具,该旅客搜索结束。也用过lag分析函数.现在的测试效果很慢,数据量太大了,上亿的数据,求优化算法。我觉得如果能“直接”取得每个旅客上次出行记录,速度就上来了,而不是去比较之前的每一天。
请注意:
不是每天旅客都出行的
对于一名旅客每次出行,都会有当前交通工具, 上次交通工具的统计
当前交通工具获取很简单,直接插入即可,难点在于上次交通工具的获取,日期是不定的
业务需求是查询一段时间内,交通工具的转化情况,如:2013.1.1 到2013.5.30 汽车 到 飞机 的转化比
...全文
405 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
hu825065235 2014-07-05
  • 打赏
  • 举报
回复
用lag()over() 或者是lead()over() 看你的排序时间怎么弄的
小灰狼W 2014-06-02
  • 打赏
  • 举报
回复
select 旅客姓名,日期,当前交通工具, (select max(当前交通工具)keep(dense_rank last order by 当前日期) from 表t where 旅客姓名=x.旅客姓名 and 当前日期<x.当前日期)上次交通工具 from 表t x 建旅客姓名、当前日期、当前交通工具 组合索引
天天天晴朗 2014-06-02
  • 打赏
  • 举报
回复
引用
我觉得如果能“直接”取得每个旅客上次出行记录,速度就上来了,而不是去比较之前的每一天。
这个方向应该是对的。 对于大数据量的查询应该尽量避免使用min,max等分组函数和排序的,因为效率差。 而旅客又不是每天都出行,所以只是通过sql的优化是无法避免对于过去记录的max或者排序的。 建议楼主使用触发器做成一张记录表。 专门记录旅客最后一次出行使用交通工具的信息。 这样在查询的时候就可以方便的取出最后一次的出行信息。 这时候应该可以用到唯一的索引,大大提高检索效率。 但是这里有一个前提就是对于同一个旅客的数据在进入数据库的时候,日期必须是最新的。 也就是说数据库里面已经存在20140602的数据的时候,是不可以插入20140508的数据的,不知道能不能在业务上面保证这种数据的不出现。
vbasten 2014-06-01
  • 打赏
  • 举报
回复
up up up

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧