急:ORACLE数据操作问题,求高人指点!

ORACLE中,如何通过sql将BEGIN置为上一个相邻的记录的task_id,END置为相邻的下一个记录的task_id?如果为第一条记录则BEGIN为ON,最后一条记录则END为OFF?
ru
ID TASK_ID BEGIN END
1 111
3 112
5 113
7 121
9 131
11 132
13 133
15 134
17 135
19 141

第1个回答  2013-05-15
记忆中ORACLE的UPDATE语句也是支持分析函数的,所以借鉴楼上这位仁兄的回答,
可以这样实现你的需求:
UPDATE TABLENAME

SET
BEGIN=lag(task_id, 1, 'begin') over(PARTITION BY id ORDER BY id),
END=lead(task_id, 1, 'end') over(PARTITION BY id ORDER BY id)
没有环境,没经过测试,你可以在你的机器上测试下。追问

这样的话会报:ORA-30483: window functions are not allowed here
估计这样不行

追答

不知道你实现了没有,没有的话试试下面的方法:
UPDATE TABLENAME T1
SET
(T1.BEGIN,T1.END)=
(
SELECT
lag(T2.task_id, 1, 'begin') over(PARTITION BY T2.id ORDER BY T2.id),
lead(T2.task_id, 1, 'end') over(PARTITION BY T2.id ORDER BY T2.id)
FROM TABLENAME T2
WHERE
T2..=T1...(主键关联..)
)

第2个回答  推荐于2017-10-05
oracle lag和lead函数
这两个函数,是偏移量函数,其用途是:可以查出同一字段下一个值或上一个值,并作为新列存在表中。
SELECT id,
task_id,
lag(task_id, 1, 'begin') over(PARTITION BY id ORDER BY id),
lead(task_id, 1, 'end') over(PARTITION BY id ORDER BY id)
FROM TABLE本回答被提问者采纳

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网