如上图的表中,怎么将表中第一行的cal_date重新赋值为第二行的cal_date,第二列的cal_date赋值为第三行的cal_date,依次往下移动,请各位大神帮下忙,一直没写出来,谢谢了

解决方案 »

  1.   

    --向下偏移一行:
    select A.*,lag(cal_date,1,null) over (order by cal_date) from yourTable;--向上偏移一行:
    select A.*,lead(cal_date,1,null) over (order by cal_date) from yourTable;另:null 可改成你需要的缺省值
      

  2.   


    其实就是每一行数据,都用上面一行数据中,这个列的值,我写了一个例子,你可以参考一下:with t(month,cal_date,source_bill)
    as
    (
    select '2015-05','2015-05-21','0001AA10000' FROM DUAL UNION ALL
    select '2015-06','2015-07-21','0001AA10000' FROM DUAL UNION ALL
    select '2015-07','2015-07-21','0001AA10000' FROM DUAL UNION ALL
    select '2015-08','2015-10-21','0001AA10000' )SELECT *,
           LAG(CAL_DATE,1,NULL) OVER(ORDER BY MONTH) NEXT_CAL_DATE 
    FROM T
    /*
    month cal_date source_bill NEXT_CAL_DATE
    2015-05 2015-05-21 0001AA10000 NULL
    2015-06 2015-07-21 0001AA10000 2015-05-21
    2015-07 2015-07-21 0001AA10000 2015-07-21
    2015-08 2015-10-21 0001AA10000 2015-07-21
    */
      

  3.   


    注意,这里的lag函数的意思是 取前1行(上面1行)的意思,也就是当前行的列值是abc,而上一行的值是yyy,那么对于abc这一行的数据来说,lag(字段名,1)会取到上一行的值yyy