我有一个表:就叫tableA,tableB吧,里面有这样的数据:下面是tableB的数据:操作类型A代表新开,E代表修改,D代表删除日志编号 编号 操作类型 速率
1 101 A 100M
2 101 E 200M
3 101 E 200M
5 101 E 50M
6 101 D 这个表的数据是对tableA的数据的修改而生成的,其中tableA的字段信息与tableB相似,只不过tableB是tableA的修改日志
其中tableB当中的编号是tableA的主键现在我要对这个表里的数据进行统计:增速,减速(统计相邻两条编号相同的记录即统计全为101的相邻两条记录)其中增速包括由A->E,当然日志编号为A的速率要小于日志编号为2的速率,这代表增速
上述记录中日志编号为1和2的记录为增速.
而编号记录为2和3的他们的速率相同则不增不减.这个可以不计.
而编号3和5的记录则为减速,因为编号3的速率为200M,编号为5的为50M,因此这说明减速一次.最后想要的结果是对编号为101的记录信息,得到增速几次,减速几次?大家有没有好的解决方案不防说说看.
1 101 A 100M
2 101 E 200M
3 101 E 200M
5 101 E 50M
6 101 D 这个表的数据是对tableA的数据的修改而生成的,其中tableA的字段信息与tableB相似,只不过tableB是tableA的修改日志
其中tableB当中的编号是tableA的主键现在我要对这个表里的数据进行统计:增速,减速(统计相邻两条编号相同的记录即统计全为101的相邻两条记录)其中增速包括由A->E,当然日志编号为A的速率要小于日志编号为2的速率,这代表增速
上述记录中日志编号为1和2的记录为增速.
而编号记录为2和3的他们的速率相同则不增不减.这个可以不计.
而编号3和5的记录则为减速,因为编号3的速率为200M,编号为5的为50M,因此这说明减速一次.最后想要的结果是对编号为101的记录信息,得到增速几次,减速几次?大家有没有好的解决方案不防说说看.
create table A
(
ID NUMBER,
CODE NUMBER,
TYPE VARCHAR2(1),
SPEED NUMBER
)为了方便,我将速率定为NUMBER。select
sum(case when (case when t1.speed is null then 0 else t1.speed end )>(case when t2.speed is null then 0 else t2.speed end ) then 1 else 0 end) 减速,
sum(case when (case when t1.speed is null then 0 else t1.speed end )<(case when t2.speed is null then 0 else t2.speed end ) then 1 else 0 end) 加速
from a t1,a t2
where
t1.code=101
and t1.code=t2.code
and t2.code=t1.code
and t1.id<t2.id and t2.id=(select min(t3.id) from a t3 where t3.id>t1.id)
sum(case when nvl( t1.speed, 0)>nvl( t2.speed, 0) then 1 else 0 end) 减速,
sum(case when nvl( t1.speed, 0)<nvl( t2.speed, 0) then 1 else 0 end) 加速
from a t1,a t2
where
t1.code=111
and t1.code=t2.code
and t2.code=t1.code
and t1.id<t2.id and t2.id=(select min(t3.id) from a t3 where t3.id>t1.id)
表名:trn問題
LOGID SUBID OPTYPE VOLUME
1 1 101 A 100
2 2 101 E 200
3 3 101 E 200
4 5 101 E 50
6 8 101 E 150
5 10 101 D select v.subid,
sum(case
when v.volume < w.volume then
1
else
0
end) up,
sum(case
when v.volume > w.volume then
1
else
0
end) down
from (select t.logid, min(s.logid) sublogid
from trn問題 t, trn問題 s
where t.logid < s.logid
and t.subid = s.subid
group by t.logid) temp
inner join trn問題 v on temp.logid = v.logid
inner join trn問題 w on temp.sublogid = w.logid
group by v.subid結果:
SUBID UP DOWN
1 101 2 1
日志编号 编号 操作类型 速率
1 101 A 20
2 101 E 30
3 101 E 20如果编号为101的并且日志编号为相邻的话那么结果是正常的.但是如果同样为101的,但是日志编号不相邻,就统计不出结果来
比如:
日志编号 编号 操作类型 速率
1 101 A 20
2 101 E 30
3 101 E 20
4 102 A 10
5 101 E 50
那么日志编号为5,编号为101的记录就统计不出来了
大家还有好的方法吗?我的想法是把表当中的数据按照编号进行分组插入到一个临时表当中,想让物理表的数据按照这样来排:
日志编号 编号 操作类型 速率
1 101 A 20
2 101 E 30
3 101 E 20
5 101 E 50
4 102 A 10这样的话我就可以在临时表当中再加进一个字段:新的递增字段ID,这样他们就会一个挨一个了.
就会得到正确结果
SQL> select * from tb order by logid; LOGID ID A SPEED
---------- ---------- - ----------
1 101 A 20
2 101 E 50
3 102 A 20
4 101 E 80
5 102 E 50
6 101 E 30已选择6行。SQL> select id,decode(diff,1,'加速',-1,'减速'),ct
2 from (select id, sign(lead_speed-speed) diff, count(*) ct
3 from (select logid, id, speed,
4 lead(speed,1,-1) over (partition by id order by logid) lead_speed
5 from tb)
6 where lead_speed<>-1
7 group by id, sign(lead_speed-speed))
8 where diff<>0; ID DECO CT
---------- ---- ----------
101 加速 2
101 减速 1
102 加速 1