解决方案 »
- 如何查看ORACLE数据结构
- VMware Gsx 安装时注册信息怎么填
- oracle安装到C盘,ghost备份C盘,恢复系统非C盘表空间数据的恢复
- 请教:关于对已经安装好数据库系统做双机的问题,请大侠赐教。
- 紧急求助,各位大虾。。。。。谢谢先!!!!在线等待
- 为什么在Oracle Plus写入的数据,用java都不出来,只能读到java自己写数据
- 请问borland公司的dataset中是否有preparestatement类似的预处理语句?
- 在存储过程中创建视图的问题,怎么写啊???????
- 建立倒序索引为什么会不起作用
- OMS服务启动不了,说什么Windows内部错误,急啊!
- 将txt导入到oracle中有什么办法?
- 急..开发问题,求解....坐等大虾
SQL> select * from A
2 /
ID AGE LAST_AGE OK
---------- ---------- ---------- ----------
1 15 1
2 19 0
3 12 1
4 18 1
5 35 1
6 23 1
7 16 1
8 24 1
9 13 1
10 3 1
10 rows selected
---------- ---------- ---------- ----------
1 15 14 1
2 19 18 0
3 12 3 1
4 18 16 1
5 35 24 1
6 23 18 1
7 16 15 1
8 24 23 1
9 13 12 1
10 3 1
update a set last_age=
(select b.age from a b where a.id!=b.id and ok is not null and ok !=0 and a.age>b.age
rownum=1 order by a.age-b.age )
create table A(ID number not null,age number,last_age number,OK number);insert into a values (1,15,null,1);
insert into a values (2,19,null,0);
insert into a values (3,12,null,1);
insert into a values (4,18,null,1);
insert into a values (5,35,null,1);
insert into a values (6,23,null,1);
insert into a values (7,16,null,1);
insert into a values (8,24,null,1);
insert into a values (9,13,null,1);
insert into a values (10,3,null,1);
insert into a values (11,15,null,1);
insert into a values (12,23,null,1);select id,age,(select distinct max(b.age) from a b where b.age < a.age and b.ok is not null and b.ok <> 0) last_age,ok
from a id age last_age ok
-----------------------------------------
1 1 15 13 1
2 2 19 18 0
3 3 12 3 1
4 4 18 16 1
5 5 35 24 1
6 6 23 18 1
7 7 16 15 1
8 8 24 23 1
9 9 13 12 1
10 10 3 1
11 11 15 13 1
12 12 23 18 1
(
ID NUMBER NOT NULL,
age NUMBER,
last_age NUMBER,
OK NUMBER
);INSERT INTO T184 VALUES(1, 15, NULL, 1);
INSERT INTO T184 VALUES(2, 19, NULL, 0);
INSERT INTO T184 VALUES(3, 12, NULL, 1);
INSERT INTO T184 VALUES(4, 18, NULL, 1);
INSERT INTO T184 VALUES(5, 35, NULL, 1);
INSERT INTO T184 VALUES(6, 23, NULL, 1);
INSERT INTO T184 VALUES(7, 16, NULL, 1);
INSERT INTO T184 VALUES(8, 24, NULL, 1);
INSERT INTO T184 VALUES(9, 13, NULL, 1);
INSERT INTO T184 VALUES(10, 3, NULL, 1);
测试结果:
(
ID NUMBER NOT NULL,
age NUMBER,
last_age NUMBER,
OK NUMBER
);INSERT INTO T184 VALUES(1, 15, NULL, 1);
INSERT INTO T184 VALUES(2, 19, NULL, 0);
INSERT INTO T184 VALUES(3, 12, NULL, 1);
INSERT INTO T184 VALUES(4, 18, NULL, 1);
INSERT INTO T184 VALUES(5, 35, NULL, 1);
INSERT INTO T184 VALUES(6, 23, NULL, 1);
INSERT INTO T184 VALUES(7, 16, NULL, 1);
INSERT INTO T184 VALUES(8, 24, NULL, 1);
INSERT INTO T184 VALUES(9, 13, NULL, 1);
INSERT INTO T184 VALUES(10, 3, NULL, 1);
测试结果:
(
name number,
what varchar(20),
place varchar(20),
tim date,
money number,
last number,
primary key(name,place,tim)
)SQL> select * from B;
NAME WHAT PLACE TIM MONEY Last
---------- -------------------- -------------------- ----------- ---------- ----------
1 1 超市 2012/4/13 12
1 1 超市 2012/4/11 13
1 0 超市 2012/4/10 14
2 1 学校 2012/4/7 16
2 1 学校 2012/4/16 31
2 1 学校 2012/4/26 12
6 rows selected
不好意思题目模拟描述有问题是某人去某地买东西last=前面一个日期在同一个地方买的东西的钱,不为0不为空的数据,what=0的数据不算在内
create table B
(
name number,
what varchar(20),
place varchar(20),
tim date,
money number,
last number,
primary key(name,place,tim)
)
insert into b values (1,1,'超市',date'2012-04-13',12,null);
insert into b values (1,1,'超市',date'2012-04-11',13,null);
insert into b values (1,0,'超市',date'2012-04-10',14,null);
insert into b values (2,1,'学校',date'2012-04-07',16,null);
insert into b values (2,1,'学校',date'2012-04-16',31,null);
insert into b values (2,1,'学校',date'2012-04-26',12,null);select name,what,place,tim,money,
(select max(a.money) from b a where a.tim < b.tim and a.what is not null and a.what <> 0 and b.name=a.name) last
from b name what place tim money last
-----------------------------------------------------------
1 1 1 超市 2012/4/13 12 13
2 1 1 超市 2012/4/11 13
3 1 0 超市 2012/4/10 14
4 2 1 学校 2012/4/7 16
5 2 1 学校 2012/4/16 31 16
6 2 1 学校 2012/4/26 12 31
update b set last=(select max(a.money) from b a where a.tim < b.tim and a.what is not null and a.what <> 0 and b.name=a.name) ;select * from b; name what place tim money last
-----------------------------------------------------------
1 1 1 超市 2012/4/13 12 13
2 1 1 超市 2012/4/11 13
3 1 0 超市 2012/4/10 14
4 2 1 学校 2012/4/7 16
5 2 1 学校 2012/4/16 31 16
6 2 1 学校 2012/4/26 12 31
select t.*,Lead(money,1) over( partition by name order by tim desc) from luojf_b T
where t.what is not null and t.what <> 0
---------- -------------------- -------------------- ----------- ---------- ---------- ------------------------------
1 1 超市 2012-4-13 12 13
1 1 超市 2012-4-11 13
2 1 学校 2012-4-26 12 31
2 1 学校 2012-4-16 31 16
2 1 学校 2012-4-7 16
update b
set b.last =
(select money1
from (select name,
place,
tim,
lag(money, 1)over(partition by name, place order by tim) money1
from b) c
where b.name = c.name
and b.place = c.place
and b.tim = c.tim);
1.按照这样的做法 what=0的前面一个或者money is null或money等于0的这些记录无法找到上一次
2.表非常大,一次性commit不行
(select max(a.money) from b a where a.tim=(select max(c.tim) from b c where c.tim<b.tim and c.what <> 0)
and a.what is not null and b.name=a.name and a.place=b.place)
/
2、使用lag over,对于age相同的记录,存在问题,需要先去重复。--方案1、一般思路
select t.sid, t.age, (select max(s.age) from sl_test s where s.age<t.age and nvl(s.ok,0)!=0) last_age
from sl_test t;
--方案2、使用lag over,对于ok为0的记录,仍有问题。
"what=0的前面一个或者money is null或money等于0的这些记录无法找到上一次" 这个你不是可以在“select money1”上加处理吗,有考虑这个,但是不知道对这种情况你的要求是怎么处理,应该是好解决的“表非常大,一次性commit不行”,不知道你的表有多大,你可以去了解一下在Oracle下将事务分多次commit和与一次commit时的比较和分析。更新耗时和资源消耗的情况得看你具体的数据量,要得到较优的处理得自己做比较,没有一次commit或多次commit的选择哪个一定会更好的标准说法。