Oracle LAG()函数

1.1 LAG()
这个函数可以取出某个字段前N条记录的值。

1.2 SELECT C.*,LAG(C.CNAME,1) OVER(ORDER BY C.CNO) FROM COURSE C
第一条记录已经无法再取前一条记录,所以LAG()函数返回空。
LAG(C.CNAME, 1) 表示取前一条记录的CNAME的值。
OVER(ORDER BY C.CNO)表示按CNO来排序,然后决定记录之间的前后关系。

1.3 在OVER()里面还可以加入PARTITION BY,如下SQL
SELECT C.*,LAG(C.CNAME,1) OVER(PARTITION BY C.TNO ORDER BY C.CNO) FROM COURSE C
PARTITION BY是用来分区的。
对TNO进行分区,在不同的TNO下寻找上一条记录的CNAME的值。
所以查询结果中T001,T002,T003中分别有一条记录最后的值为空。

1.4 如果希望在没有前N条记录的时候不返回空,可以使用默认值,SQL如下
SELECT C.*,LAG(C.CNAME,1,'DEFAULT') OVER(PARTITION BY C.TNO ORDER BY C.CNO) FROM COURSE C
在原来的空值的地方出现了DEFAULT,当然这个值根据自己的需要设定想要的值。
LEAD()函数与此类似,不过它是查询某字段的后N条记录的值。

1.5 举例:表A字段如下 
MONTH  PERSON  INCOME 
月份   人员    收入 

要求用一个SQL语句(注意是一个)的求出所有人(不区分人员)每个月及上月和下月的总收入 
要求列表输出为:月份、当月收入、上月收入、下月收入 
SELECT MONTHS, MAX(INCOMES), MAX(PREV_MONTHS), MAX(NEXT_MONTHS)
FROM (
         SELECT MONTHS,
                INCOMES,
                DECODE(LAG(MONTHS) OVER (ORDER BY MONTHS), TO_CHAR(ADD_MONTHS(TO_DATE(MONTHS, 'YYYYMM'), -1), 'YYYYMM'),
                       LAG(INCOMES) OVER (ORDER BY MONTHS), 0)  AS PREV_MONTHS,
                DECODE(LEAD(MONTHS) OVER (ORDER BY MONTHS), TO_CHAR(ADD_MONTHS(TO_DATE(MONTHS, 'YYYYMM'), 1), 'YYYYMM'),
                       LEAD(INCOMES) OVER (ORDER BY MONTHS), 0) AS NEXT_MONTHS
         FROM (SELECT MONTHS, SUM(INCOME) AS INCOMES FROM A GROUP BY MONTHS) AA) AAA
GROUP BY MONTHS;

猜你喜欢

转载自blog.csdn.net/weixin_54108529/article/details/120410539