如何将数据内容的第二条数据中某字段update到第一条某字段

xiaoyi_k 2016-05-26 10:05:11
一张表work_gl中有多个品类,每个品类里面含有多个子项,每个子项有一个开始时间、结束时间。正确的是产生下一条的时候,上一条的结束时间为新增这条的开始时间减一天。
现在表里面的数据结束时间很多结束时间未更新,导致存在很多重叠。
请教大神,怎么将第二条数据的开始时间减一天,update到第一条的结束时间。
需要考虑到:表里面存在很多的品类。每个品类的子项数目不一样。

例如:
...全文
378 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
honghong19901224 2016-05-30
  • 打赏
  • 举报
回复
select item, name, start_day, end_day, lead(start_day-1, 1, end_day) over(partition by item order by start_day) update_day from work_gl 1 苹果 苹果1 2016/03/01 2016/03/12 2016/03/08 2 苹果 苹果2 2016/03/09 2016/03/18 2016/03/16 3 苹果 苹果3 2016/03/17 2016/03/26 2016/03/26 4 西瓜 西瓜1 2016/03/09 2016/03/18 2016/03/11 5 西瓜 西瓜2 2016/03/12 2016/03/21 2016/03/17 6 西瓜 西瓜3 2016/03/18 2016/03/27 2016/03/22 7 西瓜 西瓜4 2016/03/23 2016/04/03 2016/04/03 8 香蕉 香蕉1 2016/03/16 2016/03/25 2016/03/20 9 香蕉 香蕉2 2016/03/21 2016/03/29 2016/03/27 10 香蕉 香蕉3 2016/03/28 2016/04/04 2016/04/01 11 香蕉 香蕉4 2016/04/02 2016/04/12 2016/04/07 12 香蕉 香蕉5 2016/04/08 2016/04/15 2016/04/15 create table test as select item, name, start_day, lead(start_day-1, 1, end_day) over(partition by item order by start_day) end_day from work_gl 1 苹果 苹果1 2016/03/01 2016/03/08 2 苹果 苹果2 2016/03/09 2016/03/16 3 苹果 苹果3 2016/03/17 2016/03/26 4 西瓜 西瓜1 2016/03/09 2016/03/11 5 西瓜 西瓜2 2016/03/12 2016/03/17 6 西瓜 西瓜3 2016/03/18 2016/03/22 7 西瓜 西瓜4 2016/03/23 2016/04/03 8 香蕉 香蕉1 2016/03/16 2016/03/20 9 香蕉 香蕉2 2016/03/21 2016/03/27 10 香蕉 香蕉3 2016/03/28 2016/04/01 11 香蕉 香蕉4 2016/04/02 2016/04/07 12 香蕉 香蕉5 2016/04/08 2016/04/15
ghx287524027 2016-05-26
  • 打赏
  • 举报
回复
Lag和Lead分析函数可以在同一次查询中取出同一字段的前N行的数据(Lag)和后N行的数据(Lead)作为独立的列。这种操作可以代替表的自联接,并且LAG和LEAD有更高的效率。 语法如下: /*语法*/ lag(exp_str,offset,defval) over() Lead(exp_str,offset,defval) over() --exp_str要取的列 --offset取偏移后的第几行数据 --defval:没有符合条件的默认值 实在不行的话,就建个中间表,相互更新
原味紅豆 2016-05-26
  • 打赏
  • 举报
回复
原味紅豆 2016-05-26
  • 打赏
  • 举报
回复
你的意思也就是在重新插入一条数据时,自动更新结束时间等于上一条数据结束时间加一天是吧,根据种类来区分? 如果是这样的话可以在表上建个触发器 create or replace TRIGGER ad before insert ON work_gl FOR EACH ROW begin update work_gl set end_day=to_char(to_date(:new.start_day)-1) where item=:new.item and end_day=(select max(end_day) from work_gl where item=:new.item); end;
Z_B_Hrunqian 2016-05-26
  • 打赏
  • 举报
回复
select item,name,start_day,end_day,lead(start_day,1,end_day) over(partition by item order by start_day) update_day from work_gl
卖水果的net 2016-05-26
  • 打赏
  • 举报
回复
楼主研究一下 lag 函数, 这个可以解决你的问题

17,086

社区成员

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

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