Funções analiticas LAG/LEAD

0

Posted on : 01-10-2008 | By : .rafa | In : Oracle, PL/SQL

Ambas as funções tem como sua sintaxe parecidas:

LAG  (value_expression [,offset] [,DEFAULT]) OVER ([query_partition_clase] order_by_clause)
LEAD (value_expression [,offset] [,DEFAULT]) OVER ([query_partition_clase] order_by_clause)

LAG

Esta é uma função analitica. Que provem o acesso a mais que um registro de uma tabela ao mesmo tempo sem precisar fazer um join na própria tabela self join. A busca irá retornar uma ou mais registros anteriores a da possição atual (current).

value_expression - É a expressão que irá retornar da query.
offset - É opcional, caso não seja informar o padrão é 1. Onde este é o campo que podes informar quantos registros deverá retornar.
default - É opcional, caso não seja informado o valor será null.
query_partition_clase - É opcional pois se tiveres particionamento podes colocar a clausula de particionamento .
order_by_clause - É opcional pois desta forma irá informar a ordem que queres pegar a informação anterior.

Exemplo para simplificar:
Para fins estatisticos podemos verificar quanto em estoque temos que ter de um determinado produto ou tivemos que ter entre um mês e outro.

DROP TABLE estoque;
CREATE TABLE estoque (produto CHAR(1), dat DATE, qtde NUMBER);
INSERT INTO estoque SELECT 'A',TRUNC(sysdate-((DBMS_RANDOM.VALUE(1,90))*30/10)),TRUNC(DBMS_RANDOM.VALUE(1,100)) FROM dual CONNECT BY LEVEL < = 100;
INSERT INTO estoque SELECT 'B',TRUNC(sysdate-((DBMS_RANDOM.VALUE(1,90))*30/10)),TRUNC(DBMS_RANDOM.VALUE(1,100)) FROM dual CONNECT BY LEVEL <= 100;
INSERT INTO estoque SELECT 'C',TRUNC(sysdate-((DBMS_RANDOM.VALUE(1,90))*30/10)),TRUNC(DBMS_RANDOM.VALUE(1,100)) FROM dual CONNECT BY LEVEL <= 100;
COMMIT;
 
SELECT produto,TO_CHAR(dat, 'FMYYYY/MM', 'nls_date_language=portuguese') mes,
SUM(qtde) soma_normal,
SUM(qtde) + NVL(LAG(SUM(qtde))
over(ORDER BY TO_CHAR(dat, 'FMYYYY/MM', 'nls_date_language=portuguese')),
0) ACUMULADO
FROM estoque
WHERE produto ='A'
GROUP BY (produto,TO_CHAR(dat, 'FMYYYY/MM', 'nls_date_language=portuguese'))
ORDER BY produto,TO_CHAR(dat, 'FMYYYY/MM', 'nls_date_language=portuguese');
 
PRODUTO    MES        SOMA_NORMAL    ACUMULADO
A        2008/1    514            514
A        2008/2    1073        1587
A        2008/3    805            1878
A        2008/4    287            1092
A        2008/5    633            920
A        2008/6    355            988
A        2008/7    236            591
A        2008/8    625            861
A        2008/9    457            1082

LEAD

Simplesmente é o contrario do LAG, ele irá pegar o proximo valor.

Funções analiticas
LEAD
LAG

Post a comment

*