對表中的數據的某一欄,上下兩條求差,然后全部顯示出來。不用零時表,也不要設變量,直接 select行不行。

解决方案 »

  1.   

    假设你想要显示的表A的字段B  
    select b,lag(b,1,0) over() pre_g,b-lag(b,1,0) over() c
    from a
      

  2.   

    over里面还是要加order by 
    select b,lag(b,1,0) over() pre_g,b-lag(b,1,0) over(order by rowid) c 
    from a 
    这个是按照默认顺序取的
    如果是要按照B 字段排序后取的
     
    select b,lag(b,1,0) over() pre_g,b-lag(b,1,0) over(order by b) c 
    from a 
      

  3.   

    lag就是取前面数据
    lag(要取的字段值名,取前N 条,默认值) over(partition by 分组字段1,字段2 order by 排序字段1,字段2)lag(b,1,0) 这里的意思,就是取b字段的值,取前一条纪录,取不到的话,默认就是0
      

  4.   

    也可以用lead(b,1,0)
    lead是取后一条纪录
      

  5.   

    10G的写法
    select  WMSYS.WM_CONCAT(aa.c) c
    from(
    select b,lag(b,1,0) over() pre_g,b-lag(b,1,0) over(order by rowid) c ,1 no
    from a ) aa
    where pre_g>0
    group by aa.no
      

  6.   

    测试
    WITH a AS
         (SELECT 1 b
            FROM DUAL
          UNION ALL
          SELECT 4 b
            FROM DUAL
          UNION ALL
          SELECT 6 b
            FROM DUAL
          UNION ALL
          SELECT 8 b
            FROM DUAL
          UNION ALL
          SELECT 9 b
            FROM DUAL)
    SELECT   wmsys.wm_concat (aa.c) c
        FROM (SELECT b, LAG (b, 1, 0) OVER (ORDER BY b) pre_g,
                     b - LAG (b, 1, 0) OVER (ORDER BY b) c, 1 NO
                FROM a) aa
       WHERE pre_g > 0
    GROUP BY aa.NO结果
    c
    3,2,2,1
      

  7.   

    如果B里面可能出现0,你可以指定lag(b,1,null)
    然后在外面写上
    pre_g is not null
    这样就保证不会过滤掉B为0的情况