如下表,其中的流水号是按累加值的大小在某个类别中由小至大排列,差值=后一个流水号的累加值—前一个流水号的累加值,现在求一个SQL语句来求差值(最好是一句SQL语句来实现) 
序号----类别----流水号----累加值----差值 
---------- ------------------------- ---------- ---------- ---------- 
1 -----A0001 ----1 --------100 
2-----A0001 ----2 --------120 
3 -----A0001 ----3 --------150 
---------- ------------------------- ---------- ---------- ---------- 
99 -----A0002----1 --------50 
100----A0002 ----2 --------60 
101 -----A0002 ----3 --------90 
---------- ------------------------- ---------- ---------- ---------- 
256 -----A0003 ----1 --------210 
257 -----A0003 ----2 --------270 
258-----A0003 -----3-------280 
---------- ------------------------- ---------- ---------- ---------- 
300 -----A0004 ----1 --------70 
301 -----A0004 ----2 --------120 
302-----A0004 ----3--------150 结果 序号----类别----流水号----累加值----差值 
---------- ------------------------- ---------- ---------- ---------- 
1 -----A0001 ----1 --------100 --------20 
2-----A0001 ----2 --------120--------30 
3 -----A0001 ----3 --------150 -------- 
---------- ------------------------- ---------- ---------- ---------- 
99 -----A0002----1 --------50 --------10 
100----A0002 ----2 --------60--------30 
101 -----A0002 ----3 --------90-------- 
---------- ------------------------- ---------- ---------- ---------- 
256 -----A0003 ----1 --------210 --------60 
257 -----A0003 ----2 --------270-------- 10 
258-----A0003 -----3-------280-------- 
---------- ------------------------- ---------- ---------- ---------- 
300 -----A0004 ----1 --------70 --------50 
301 -----A0004 ----2 --------120 --------30 
302-----A0004 ----3--------150 -------- 
此问题有点类似下一行减去上一行,但是此问题是在一个小类别里按流水号的大小下一行减去上一行。

解决方案 »

  1.   

    SELECT last_name, hire_date, salary,
    LAG(salary, 1, 0) OVER (ORDER BY hire_date) AS prev_sal
    FROM employees
    WHERE job_id = ’PU_CLERK’;
    LAST_NAME HIRE_DATE SALARY PREV_SAL
    ------------------------- --------- ---------- ----------
    Khoo 18-MAY-95 3100 0
    Tobias 24-JUL-97 2800 3100
    Baida 24-DEC-97 2900 2800
    Himuro 15-NOV-98 2600 2900
    Colmenares 10-AUG-99 2500 2600
      

  2.   

    谢谢 hdkkk(diablo2),在你的帮助下问题搞定了
      

  3.   

    SELECT 序号,类别,流水号,累加值,lead(累加值,1,null) over(partition by 类别 order by 累加值)-累加值 差值
    from table_name
      

  4.   

    我是一个菜,不知道各位大侠能否详细讲解一下lag lead over这些函数
      

  5.   

    http://download-west.oracle.com/docs/cd/B10501_01/server.920/a96540/functions56a.htm#83619http://download-west.oracle.com/docs/cd/B10501_01/server.920/a96540/functions60a.htm#83836
      

  6.   

    谢谢 hdkkk(diablo2),在你的帮助下问题搞定了
    -------------------------------------------
    来慢了 :(