ead()是一个分析函数,适用于oracle 8i以后的版本,
使用这个函数,你可以一次性从表中查询多条记录,
而不需要进行表的自连接。
返回值:返回与当前行偏离offset行的列值。
语法:
lead ( expression [, offset [, default] ] )
over ( [ query_partition_clause ] order_by_clause )
expression :可以包含除了分析函数意外的任何oracle内置函数。
offset :可选项,表里偏移当前行的值,默认值为1。
default :可选项,如果offset值超出了当前表范围,就返回此值,默认值为null.
下面是一个实例:
1.
with orders as(
select to_date('25-09-2007','dd-mm-yyyy') order_date,1000 product_id,20 qty from dual union all
select to_date('26-09-2007','dd-mm-yyyy'),2000,15 from dual union all
select to_date('27-09-2007','dd-mm-yyyy'),1000,8 from dual union all
select to_date('28-09-2007','dd-mm-yyyy'),2000,12 from dual union all
select to_date('29-09-2007','dd-mm-yyyy'),2000,2 from dual union all
select to_date('30-09-2007','dd-mm-yyyy'),1000,4 from dual)
select product_id,order_date,
lead(order_date,1) over (order by order_date) next_order_date
from orders;
PRODUCT_ID ORDER_DATE NEXT_ORDER_DATE
---------- ----------- ---------------
1000 2007-9-25 2007-9-26
2000 2007-9-26 2007-9-27
1000 2007-9-27 2007-9-28
2000 2007-9-28 2007-9-29
2000 2007-9-29 2007-9-30
1000 2007-9-30
--
因为offset值为1,所以查询出了下一个order_date
如果我们将offset设为2,那么会查询出往下第二个order_date,
如果offset为3呢,将会查询出往下第三个order_date,
......
2.使用上面的数据。
select product_id,order_date,
lead(sum(qty),1,0) over (order by order_date) sum_next_qty
from orders
group by product_id,order_date;
PRODUCT_ID ORDER_DATE SUM_NEXT_QTY
---------- ----------- ------------
1000 2007-9-25 8
1000 2007-9-27 4
1000 2007-9-30 15
2000 2007-9-26 12
2000 2007-9-28 2
2000 2007-9-29 0
我们先按product_id分组,再按order_date分组