我有一个表:就叫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.   

    -- Create table
    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)
      

  2.   

    select  
    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)
      

  3.   

    樓上用了相關子查詢。我用另一種方法,但思路是一樣的。爲了簡單,我只操作一個表。關鍵是要構造出一個合適的中間表。
    表名: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
      

  4.   

    楼上的几种想法都不太符合要求,但是很不错.因为他们能够统计出相邻的编号的增减及不变情况,却统计不出带有间隔性的那种.比如:
    日志编号 编号 操作类型 速率
    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,这样他们就会一个挨一个了.
    就会得到正确结果
      

  5.   

    用分析函数实现
    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