Você está na página 1de 40

Sumario Introducao Denicoes Funcoes. Conclusao.

Entendendo Oracle Analytic functions


Deivid Bitti Padilha

2012

oracle

Deivid Bitti Padilha

Entendendo Oracle Analytic functions

Sumario Introducao Denicoes Funcoes. Conclusao.

Introducao O que e ? Vantagens. Sintaxe. Denicoes No que diferencia das demais funcoes de agregacao ? Funcoes. ROW NUMBER, RANK e DENSE RANK LEAD e LAG FIRST VALUE e LAST VALUE Funcao FIRST e LAST Especicando <Window Clause> Ordem de computacao e dicas de performance. Conclusao. Referencias
Deivid Bitti Padilha Entendendo Oracle Analytic functions

oracle

Sumario Introducao Denicoes Funcoes. Conclusao.

O que e ? Vantagens. Sintaxe.

Sumario
1

2 3

Introducao O que e ? Vantagens. Sintaxe. Denicoes No que diferencia das demais funcoes de agregacao ? Funcoes. ROW NUMBER, RANK e DENSE RANK LEAD e LAG FIRST VALUE e LAST VALUE Funcao FIRST e LAST Especicando <Window Clause> Ordem de computacao e dicas de performance. Conclusao. Entendendo Oracle Analytic functions Referencias Deivid Bitti Padilha

oracle

Sumario Introducao Denicoes Funcoes. Conclusao.

O que e ? Vantagens. Sintaxe.

O que e ?

Funcoes analticas (FA) sao um conjunto de comandos e conceitos que permitem computar um valor agregado baseado em um conjunto de linhas. Normalmente, muitas funcionalidades que sao fornecidas nativamente sao feitas na mao, utilizando comandos SQL padrao com joins, subqueries, clausula WITH, etc. Porem, utilizar FA traz muitas vantagens.

oracle

Deivid Bitti Padilha

Entendendo Oracle Analytic functions

Sumario Introducao Denicoes Funcoes. Conclusao.

O que e ? Vantagens. Sintaxe.

Vantagens do uso de Funcoes Analticas

Tendo o problema resolvido atraves de FA e, na maioria das vezes, muito mais performatico do que utilizando funcoes padroes. O comando SQL, normalmente ca menor, consequentemente mais legvel e de facil depuracao e teste. Algumas funcionalidades das FA so poderiam ser do uso de procedimentos PL/SQL. substitudas atraves
oracle

Deivid Bitti Padilha

Entendendo Oracle Analytic functions

Sumario Introducao Denicoes Funcoes. Conclusao.

O que e ? Vantagens. Sintaxe.

Vantagens do uso de Funcoes Analticas

Tendo o problema resolvido atraves de FA e, na maioria das vezes, muito mais performatico do que utilizando funcoes padroes. O comando SQL, normalmente ca menor, consequentemente mais legvel e de facil depuracao e teste. Algumas funcionalidades das FA so poderiam ser do uso de procedimentos PL/SQL. substitudas atraves
oracle

Deivid Bitti Padilha

Entendendo Oracle Analytic functions

Sumario Introducao Denicoes Funcoes. Conclusao.

O que e ? Vantagens. Sintaxe.

Vantagens do uso de Funcoes Analticas

Tendo o problema resolvido atraves de FA e, na maioria das vezes, muito mais performatico do que utilizando funcoes padroes. O comando SQL, normalmente ca menor, consequentemente mais legvel e de facil depuracao e teste. Algumas funcionalidades das FA so poderiam ser do uso de procedimentos PL/SQL. substitudas atraves
oracle

Deivid Bitti Padilha

Entendendo Oracle Analytic functions

Sumario Introducao Denicoes Funcoes. Conclusao.

O que e ? Vantagens. Sintaxe.

Sintaxe.
Normalmente, um SQL com FA tem a seguinte sintaxe :

Funcao(arq1,...,arqn) OVER ( [PARTITION BY <...>] [ORDER BY <...>] [window clause] )


Cada parte sera mostrada em detalhes nas proximas secoes.

oracle

Deivid Bitti Padilha

Entendendo Oracle Analytic functions

Sumario Introducao Denicoes Funcoes. Conclusao.

No que diferencia das demais funcoes de agregacao ?

Sumario
1

2 3

Introducao O que e ? Vantagens. Sintaxe. Denicoes No que diferencia das demais funcoes de agregacao ? Funcoes. ROW NUMBER, RANK e DENSE RANK LEAD e LAG FIRST VALUE e LAST VALUE Funcao FIRST e LAST Especicando <Window Clause> Ordem de computacao e dicas de performance. Conclusao. Entendendo Oracle Analytic functions Referencias Deivid Bitti Padilha

oracle

Sumario Introducao Denicoes Funcoes. Conclusao.

No que diferencia das demais funcoes de agregacao ?

Sem funcoes analticas...


Observe o SQL abaixo seguido por seu resultado:
SELECT DEPTNO, COUNT (1) AS DEPT COUNT FROM SCOTT.EMP WHERE DEPTNO IN (20, 30) GROUP BY DEPTNO;
Query-1

DEPTNO 30 20

DEPT COUNT 6 5

Como podemos obervar naQuery-1 retorna departamentos com quantidade de funcionarios. Como sabemos, colunas que nao estao na clausula GROUP BY nao podem ser includas no SELECT.
Deivid Bitti Padilha Entendendo Oracle Analytic functions

oracle

Sumario Introducao Denicoes Funcoes. Conclusao.

No que diferencia das demais funcoes de agregacao ?

Com funcoes analticas...


EMPNO 7369 7876 7566 7788 7902 7900 7844 7654 7521 7499 7698 DEPTNO 20 20 20 20 20 30 30 30 30 30 30 DEPT COUNT 5 5 5 5 5 6 6 6 6 6 6

SELECT EMPNO, DEPTNO, COUNT (1) OVER (PARTITION BY DEPTNO) AS DEPT COUNT FROM SCOTT.EMP WHERE DEPTNO IN (20, 30);
Query-2

Ja na Query-2 que utiliza FA, conseguimos trazer o total juntamente com todas as linhas.
Deivid Bitti Padilha Entendendo Oracle Analytic functions

oracle

Sumario Introducao Denicoes Funcoes. Conclusao.

No que diferencia das demais funcoes de agregacao ?

Consideracoes.
Como observado, a principal diferenca entre funcoes de agregacao e FA e que uma agrupa o resultado e a outra nao. Utilizando FA, o totalizador se repete para cada registro do resultado, e assim como em qualquer SQL sem GROUP BY, qualquer coluna ou expressao pode ser inserida na clausula SELECT, como por exemplo a coluna DEPNO na Query-2. As Funcoes Analticas sao computadas apos todos os JOINS, clausula WHERE, GROUP BY e HAVING presentes na consulta. O ORDER BY principal e feito apos a FA, desta forma colunas de FA podem aparecer no ORDER BY principal. Caso o comando PARTITION e <window clause> for omitido dentro de OVER() sera computado todos os registros limitados pela clausula WHERE. Observe os resultados da Query-3 e compare com a Query-4.
Deivid Bitti Padilha Entendendo Oracle Analytic functions

oracle

Sumario Introducao Denicoes Funcoes. Conclusao.

No que diferencia das demais funcoes de agregacao ?

Consideracoes.
Como observado, a principal diferenca entre funcoes de agregacao e FA e que uma agrupa o resultado e a outra nao. Utilizando FA, o totalizador se repete para cada registro do resultado, e assim como em qualquer SQL sem GROUP BY, qualquer coluna ou expressao pode ser inserida na clausula SELECT, como por exemplo a coluna DEPNO na Query-2. As Funcoes Analticas sao computadas apos todos os JOINS, clausula WHERE, GROUP BY e HAVING presentes na consulta. O ORDER BY principal e feito apos a FA, desta forma colunas de FA podem aparecer no ORDER BY principal. Caso o comando PARTITION e <window clause> for omitido dentro de OVER() sera computado todos os registros limitados pela clausula WHERE. Observe os resultados da Query-3 e compare com a Query-4.
Deivid Bitti Padilha Entendendo Oracle Analytic functions

oracle

Sumario Introducao Denicoes Funcoes. Conclusao.

No que diferencia das demais funcoes de agregacao ?

Consideracoes.
Como observado, a principal diferenca entre funcoes de agregacao e FA e que uma agrupa o resultado e a outra nao. Utilizando FA, o totalizador se repete para cada registro do resultado, e assim como em qualquer SQL sem GROUP BY, qualquer coluna ou expressao pode ser inserida na clausula SELECT, como por exemplo a coluna DEPNO na Query-2. As Funcoes Analticas sao computadas apos todos os JOINS, clausula WHERE, GROUP BY e HAVING presentes na consulta. O ORDER BY principal e feito apos a FA, desta forma colunas de FA podem aparecer no ORDER BY principal. Caso o comando PARTITION e <window clause> for omitido dentro de OVER() sera computado todos os registros limitados pela clausula WHERE. Observe os resultados da Query-3 e compare com a Query-4.
Deivid Bitti Padilha Entendendo Oracle Analytic functions

oracle

Sumario Introducao Denicoes Funcoes. Conclusao.

No que diferencia das demais funcoes de agregacao ?

OVER().
EMPNO 7782 7839 7934 7369 7566 7788 7876 7902 DEPTNO 10 10 10 20 20 20 20 20 TOTAL 8 8 8 8 8 8 8 8

SELECT EMPNO, DEPTNO, COUNT (1) OVER () AS TOTAL FROM SCOTT.EMP WHERE DEPTNO IN (20, 30) ORDER BY 1,2;
Query-3

SELECT COUNT(1), FROM SCOTT.EMP WHERE DEPTNO IN (20, 30)


Query-4

TOTAL 8

oracle

Deivid Bitti Padilha

Entendendo Oracle Analytic functions

Sumario Introducao Denicoes Funcoes. Conclusao.

No que diferencia das demais funcoes de agregacao ?

Como quebrar o resultado em um conjunto de grupos ou particoes?


Como vimos nos exemplos anteriores, cou obvio que e a clausula PARTITION BY que determina o criterio de quebra. Algumas funcoes suportam <window clause> dentro da particao para limitar os registros compreendidos, caso <window clause> for omitido a FA ira computar todos os registros da particao. As funcoes SUM, COUNT, AVG, MIN e MAX sao funcoes analticas que nao dependem da ordem dos elementos dentro da particao. Funcoes como LEAD, LAG, RANK, DENSE RANK, ROW NUMBER, FIRST, FIRST VALUE, LAST e LAST VALUE nos proximos exemplos veremos como isso e utilizado.
Deivid Bitti Padilha Entendendo Oracle Analytic functions oracle

Sumario Introducao Denicoes Funcoes. Conclusao.

No que diferencia das demais funcoes de agregacao ?

Como ordenar os registros dentro de uma particao?


A resposta e simples, utilizando a clausula ORDER BY dentro da clausula OVER(). Esta e a diferenca entre o ORDER BY principal que vem apos o WHERE. Nas proximas secoes, veremos cada uma das funcoes mais utilizadas: LEAD, LAG, RANK, DENSE RANK, ROW NUMBER, FIRST, FIRST VALUE, LAST, LAST VALUE e entenderemos porque elas dependem da ordem dos registros. A sintaxe da clausula ORDER BY dentro de uma FA e: ORDER BY <sql expr> [ASC or DESC] NULLS [FIRST or LAST] A sintaxe e auto-explicativa (ou pelo menos deveria ser.).
oracle

Deivid Bitti Padilha

Entendendo Oracle Analytic functions

Sumario Introducao Denicoes Funcoes. Conclusao.

ROW NUMBER, RANK e DENSE RANK LEAD e LAG FIRST VALUE e LAST VALUE Funcao FIRST e LAST Especicando <Window Clause> Ordem de computacao e dicas de performance.

Sumario
1

2 3

Introducao O que e ? Vantagens. Sintaxe. Denicoes No que diferencia das demais funcoes de agregacao ? Funcoes. ROW NUMBER, RANK e DENSE RANK LEAD e LAG FIRST VALUE e LAST VALUE Funcao FIRST e LAST Especicando <Window Clause> Ordem de computacao e dicas de performance. Conclusao. Entendendo Oracle Analytic functions Referencias Deivid Bitti Padilha

oracle

Sumario Introducao Denicoes Funcoes. Conclusao.

ROW NUMBER, RANK e DENSE RANK LEAD e LAG FIRST VALUE e LAST VALUE Funcao FIRST e LAST Especicando <Window Clause> Ordem de computacao e dicas de performance.

Estas tres funcoes associam um ` valor inteiro a linha dependendo da sua ordem, e por esse motivo que serao mostradas na mesma secao.
oracle

Deivid Bitti Padilha

Entendendo Oracle Analytic functions

Sumario Introducao Denicoes Funcoes. Conclusao.

ROW NUMBER, RANK e DENSE RANK LEAD e LAG FIRST VALUE e LAST VALUE Funcao FIRST e LAST Especicando <Window Clause> Ordem de computacao e dicas de performance.

ROW NUMBER( )

ROW NUMBER captura o numero da linha para registros de muito utilizado em relatorios, especialmente uma particao. E em lugares onde particoes diferentes tem numeros de linha distintos. Na Query-5, a funcao ROW NUMBER() e usada para obter a ordem de dos empregados em cada departamento, baseado na sua data de contratacao, coluna HIREDATE.

oracle

Deivid Bitti Padilha

Entendendo Oracle Analytic functions

Sumario Introducao Denicoes Funcoes. Conclusao.

ROW NUMBER, RANK e DENSE RANK LEAD e LAG FIRST VALUE e LAST VALUE Funcao FIRST e LAST Especicando <Window Clause> Ordem de computacao e dicas de performance.

ROW NUMBER( ) - Exemplo


EMPNO 7782 7839 7934 7369 7566 7902 7788 7876 DEPTNO 10 10 10 20 20 20 20 20 HIREDATE 09/06/81 17/11/81 23/01/82 17/12/80 02/04/81 03/12/81 19/04/87 23/05/87 ORDEM 1 2 3 1 2 3 4 5

SELECT EMPNO, DEPTNO, HIREDATE, ROW NUMBER () OVER (PARTITION BY DEPTNO ORDER BY HIREDATE NULLS LAST) AS ORDEM FROM SCOTT.EMP WHERE DEPTNO IN (10, 20) ORDER BY DEPTNO, ORDEM
Query-5

Como podemos observar na Query-5, a coluna ORDEM contem a ordem de contratacao do empregado, por departamento.
Deivid Bitti Padilha Entendendo Oracle Analytic functions

oracle

Sumario Introducao Denicoes Funcoes. Conclusao.

ROW NUMBER, RANK e DENSE RANK LEAD e LAG FIRST VALUE e LAST VALUE Funcao FIRST e LAST Especicando <Window Clause> Ordem de computacao e dicas de performance.

RANK() e DENSE RANK()

Tanto RANK() quanto DENSE RANK() exibem a posicao do registro baseado em valores de colunas ou expressoes. Caso exita 2 registros na posicao N, RANK() declara duas posicoes N, ignora a posicao N+1 e atribui a posicao N+2 ao proximo registro. Ja DENSE RANK() declara duas posicoes N mas nao ignora a posicao N+1. Para entendermos melhor, vejamos o exemplo no proximo slide.
oracle

Deivid Bitti Padilha

Entendendo Oracle Analytic functions

Sumario Introducao Denicoes Funcoes. Conclusao.

ROW NUMBER, RANK e DENSE RANK LEAD e LAG FIRST VALUE e LAST VALUE Funcao FIRST e LAST Especicando <Window Clause> Ordem de computacao e dicas de performance.

RANK() e DENSE RANK() - Exemplo


EMPNO 7839 7782 7934 7788 7902 7566 7876 7369 DEPTNO 10 10 10 20 20 20 20 20 SAL 5000 2450 1300 3000 3000 2975 1100 800 RANK 1 2 3 1 1 3 4 5 D RANK 1 2 3 1 1 2 3 4

SELECT EMPNO,DEPTNO,SAL, RANK () OVER (PARTITION BY DEPTNO ORDER BY SAL DESC NULLS LAST) RANK, DENSE RANK () OVER (PARTITION BY DEPTNO ORDER BY SAL DESC NULLS LAST) D RANK FROM SCOTT.EMP WHERE DEPTNO IN (10, 20) ORDER BY 2,RANK; Query-6

Na Query-6 vemos o uso de RANK() e DENSE RANK(). Para o DEPTNO 20, teremos dois registros na primeira posicao (EMPNO 7788 and 7902). Tanto RANK() quanto DENSE RANK() exibira os registros no topo. RANK() ignora o proximo valor que e 2, sendo assim o proximo empregado (EMPNO 7566) e colocado na posicao 3, ja com DENSE RANK() isso nao acontece.
Deivid Bitti Padilha Entendendo Oracle Analytic functions

oracle

Sumario Introducao Denicoes Funcoes. Conclusao.

ROW NUMBER, RANK e DENSE RANK LEAD e LAG FIRST VALUE e LAST VALUE Funcao FIRST e LAST Especicando <Window Clause> Ordem de computacao e dicas de performance.

LEAD e LAG
LEAD tem a habilidade de computar uma expressao nas proximas linhas (linhas existentes apos a linha corrente) e retorna o valor para a linha corrente. ` A sintaxe do LAG e similar a do LEAD, a diferenca e que o LAG ` computa linhas anteriores a linha corrente. A sintaxe do LEAD ou LAG e a seguinte: LEAD | LAG (<sql expr>, <offset>, <default>) OVER (<analytic clause>)
ao. <sql expr> E a expressao SQL a ser calculada na linha em quest ` <offset> e o indice relativo a linha atual das linhas posteriores no caso do LEAD ou anteriores quando for usado LAG, deve ser um inteiro positivo, o default e 1. <default> e o valor a ser retornado, caso <offset> apontar para uma linha fora do range da particao.
Deivid Bitti Padilha Entendendo Oracle Analytic functions oracle

Sumario Introducao Denicoes Funcoes. Conclusao.

ROW NUMBER, RANK e DENSE RANK LEAD e LAG FIRST VALUE e LAST VALUE Funcao FIRST e LAST Especicando <Window Clause> Ordem de computacao e dicas de performance.

LEAD e LAG - Exemplo


SELECT DEPTNO, EMPNO, SAL, LEAD (SAL, 1, 0) OVER (PARTITION BY DEPTNO ORDER BY SAL DESC NULLS LAST) AS NEXT LOWER SAL, LAG (SAL, 1, 0) OVER (PARTITION BY DEPTNO ORDER BY SAL DESC NULLS LAST) AS PREV HIGHER SAL FROM SCOTT.EMP WHERE DEPTNO IN (10, 20) ORDER BY DEPTNO, SAL DESC
DEPTNO 10 10 10 20 20 20 20 20 Query-7 EMPNO 7839 7782 7934 7788 7902 7566 7876 7369 SAL 5000 2450 1300 3000 3000 2975 1100 800 NEXT LOWER SAL 2450 1300 0 3000 2975 1100 800 0 PREV HIGHER SAL 0 5000 2450 0 3000 3000 2975 1100 oracle

Deivid Bitti Padilha

Entendendo Oracle Analytic functions

Sumario Introducao Denicoes Funcoes. Conclusao.

ROW NUMBER, RANK e DENSE RANK LEAD e LAG FIRST VALUE e LAST VALUE Funcao FIRST e LAST Especicando <Window Clause> Ordem de computacao e dicas de performance.

FIRST VALUE e LAST VALUE


A funcao FIRST VALUE seleciona o primeiro registro da particao apos a execucao do ORDER BY. A expressao SQL <sql expr> e computada nas colunas do primeiro registro e o seu resultado e retornado. A funcao LAST VALUE e usado em um contexto similar, sendo que a expressao e executada sob o ultimo registro da particao. A sintaxe e : FIRST VALUE|LAST VALUE(<sql expr>) OVER (<analytic clause>)
oracle

Deivid Bitti Padilha

Entendendo Oracle Analytic functions

Sumario Introducao Denicoes Funcoes. Conclusao.

ROW NUMBER, RANK e DENSE RANK LEAD e LAG FIRST VALUE e LAST VALUE Funcao FIRST e LAST Especicando <Window Clause> Ordem de computacao e dicas de performance.

FIRST VALUE - Exemplo


Quantos dias entre a contratacao do primeiro empregado e o empregado correspondente de cada departamento:
SELECT EMPNO,DEPTNO, HIREDATE - FIRST VALUE (HIREDATE) OVER (PARTITION BY DEPTNO ORDER BY HIREDATE) AS DAY GAP FROM SCOTT.EMP WHERE DEPTNO IN (20, 30) ORDER BY DEPTNO, DAY GAP EMPNO 7369 7566 7788 7876 7902 7499 7521 7844 7654 7900 7698 DEPTNO 20 20 20 20 20 30 30 30 30 30 30 DAY GAP 0 106 2314 2348 351 0 2 200 220 286 70

Query-8

oracle

Deivid Bitti Padilha

Entendendo Oracle Analytic functions

Sumario Introducao Denicoes Funcoes. Conclusao.

ROW NUMBER, RANK e DENSE RANK LEAD e LAG FIRST VALUE e LAST VALUE Funcao FIRST e LAST Especicando <Window Clause> Ordem de computacao e dicas de performance.

Funcao FIRST e LAST


A funcao FIRST (ou mais propriamente KEEP FIRST) e usado em situacoes muito especiais. Suponha que nos criamos um Rank de um grupo de registros e encontramos varios registros na primeira posicao. Agora nos precisamos aplicar uma funcao de agregacao a estes registros, a funcao KEEP FIRST ou (KEEP LAST) permite isso. A sintaxe e: Function( ) KEEP (DENSE RANK FIRST|LAST ORDER BY <expr>) OVER (<partitioning clause>) Observe que FIRST e LAST sao funcoes que desviam da sintaxe padrao das Funcoes em analticas. Tais funcoes nao t ORDER BY dentro da clausula OVER nem suportam clausula <window>, outra coisa a ser observada e que o ranking feito e sempre DENSE RANK. A proxima query (Query-9) mostra o uso da funcao FIRST. A funcao LAST e usada em um contexto similar, mas para executar operacoes nos ultimos registros.
Deivid Bitti Padilha Entendendo Oracle Analytic functions oracle

Sumario Introducao Denicoes Funcoes. Conclusao.

ROW NUMBER, RANK e DENSE RANK LEAD e LAG FIRST VALUE e LAST VALUE Funcao FIRST e LAST Especicando <Window Clause> Ordem de computacao e dicas de performance.

Funcao FIRST - Exemplo


Como comparar o salario de cada empregado com a media salarial do primeiro ano de cada departamento ?
SELECT EMPNO,DEPTNO,TO CHAR (HIREDATE, YYYY) AS HIRE YR, SAL, TRUNC(AVG (SAL)KEEP (DENSE RANK FIRST ORDER BY TO CHAR (HIREDATE,YYYY)) OVER (PARTITION BY DEPTNO)) AS AVG SAL YR1 HIRE FROM SCOTT.EMP WHERE DEPTNO IN (20, 10) ORDER BY DEPTNO,EMPNO,HIRE YR EMPNO 7782 7839 7934 7369 7566 7788 7876 7902 DEPTNO 10 10 10 20 20 20 20 20 HIRE YR 1981 1981 1982 1980 1981 1987 1987 1981 SAL 2450 5000 1300 800 2975 3000 1100 3000 AVG SAL YR1 HIRE 3725 3725 3725 800 800 800 800 800

Query-9

oracle

Deivid Bitti Padilha

Entendendo Oracle Analytic functions

Sumario Introducao Denicoes Funcoes. Conclusao.

ROW NUMBER, RANK e DENSE RANK LEAD e LAG FIRST VALUE e LAST VALUE Funcao FIRST e LAST Especicando <Window Clause> Ordem de computacao e dicas de performance.

Como especicar <Window Clause>?


Algumas funcoes analticas ja discutidas (AVG, COUNT, FIRST VALUE, LAST VALUE, MAX, MIN e SUM) podem ter uma clausula window para sub-particionar o resultado e aplicar a funcao. Uma importante funcionalidade da clausula window e que ela e dinamica por natureza. A sintaxe da <window clause> e : [ROW | RANGE] BETWEEN <start expr> AND <end expr> <start expr> pode ser : UNBOUNDED PECEDING CURRENT ROW <sql expr> PRECEDING ou FOLLOWING <end expr> pode ser: UNBOUNDED FOLLOWING CURRENT ROW <sql expr> PRECEDING ou FOLLOWING.
Deivid Bitti Padilha Entendendo Oracle Analytic functions oracle

Sumario Introducao Denicoes Funcoes. Conclusao.

ROW NUMBER, RANK e DENSE RANK LEAD e LAG FIRST VALUE e LAST VALUE Funcao FIRST e LAST Especicando <Window Clause> Ordem de computacao e dicas de performance.

<Window Clause> Continuacao...


Para windows do tipo ROW, a denicao e em termos de numeros de linhas ` anteriores ou posteriores a linha corrente, sendo assim para esse tipo <sql expr> deve retornar um inteiro positivo. Para windows do tipo RANGE, a denicao e em termos de valores anteriores ou ` posteriores a ORDEM corrente. Veremos isso com detalhes nos proximos slides. Windows ROW ou RANGE nao podem aparecer juntas em uma clausula OVER, mas podem ou nao incluir a linha corrente. O ponto de incio e o ponto de m da window podem terminar antes ou apos a linha corrente. Entretanto o ponto de incio nao pode vir apos o ponto de m da window. Caso os pontos de limitacao da window nao forem denidos, os valores default sao : UNBOUNDED PRECEDING para <start expr> e UNBOUNDED FOLLOWING para <end expr>. Se o ponto de m for a linha corrente, a sintaxe apenas para o ponto de incio pode ser: [ROW | RANGE] [<start expr> PRECEDING | UNBOUNDED PRECEDING ] [ROW | RANGE] CURRENT ROW tambem e permitido mas sera redundante, neste caso a funcao ira se comportar como uma funcao de unica linha e ira atuar apenas sobre a linha corrente.
Deivid Bitti Padilha Entendendo Oracle Analytic functions oracle

Sumario Introducao Denicoes Funcoes. Conclusao.

ROW NUMBER, RANK e DENSE RANK LEAD e LAG FIRST VALUE e LAST VALUE Funcao FIRST e LAST Especicando <Window Clause> Ordem de computacao e dicas de performance.

Window tipo ROW.


Para funcoes analticas com Window tipo ROW, a sintaxe geral e: Function( ) OVER (PARTITION BY <expr1> ORDER BY <expr2,..> ROWS BETWEEN <start expr> AND <end expr>) OU Function( ) OVER (PARTITON BY <expr1> ORDER BY <expr2,..> ROWS [<start expr> PRECEDING or UNBOUNDED PRECEDING] Como mencionado anteriormente, para esse tipo de window, o scroll da janela e feita em termos de numero de registros. A consulta do proximo slide (Query-10) ilustra o uso de varias clausulas window com a funcao COUNT(1). O COUNT simplesmente mostra o numero de linhas dentro da denicao da window. Observe os valores para cada coluna no ano 1981. A coluna FROM P3 TO F1 mostra um exemplo onde o ponto de incio da window e ` anterior a linha corrente e o ponto de m e apos a linha corrente, essa e uma janela de 5 linhas, como observado mostra valores menores do que 5 entre o incio e o m do scroll.
Deivid Bitti Padilha Entendendo Oracle Analytic functions oracle

Sumario Introducao Denicoes Funcoes. Conclusao.

ROW NUMBER, RANK e DENSE RANK LEAD e LAG FIRST VALUE e LAST VALUE Funcao FIRST e LAST Especicando <Window Clause> Ordem de computacao e dicas de performance.

Window tipo ROW. Exemplo


SELECT EMPNO,DEPTNO, TO CHAR (HIREDATE, YYYY) AS YEAR, COUNT (1) OVER (PARTITION BY TO CHAR (HIREDATE, YYYY) ORDER BY HIREDATE ROWS BETWEEN 3 PRECEDING AND 1 FOLLOWING) AS FROM P3 TO F1, COUNT (1) OVER (PARTITION BY TO CHAR (HIREDATE, YYYY) ORDER BY HIREDATE ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS FROM PU TO C, COUNT (1) OVER (PARTITION BY TO CHAR (HIREDATE, YYYY) ORDER BY HIREDATE ROWS BETWEEN 3 PRECEDING AND 1 PRECEDING) AS FROM P2 TO P1, COUNT (1) OVER (PARTITION BY TO CHAR (HIREDATE, YYYY) ORDER BY HIREDATE ROWS BETWEEN 1 FOLLOWING AND 3 FOLLOWING) AS FROM F1 TO F3 FROM SCOTT.EMP ORDER BY HIREDATE Query-10 EMPNO 7369 7499 7521 7566 7698 7782 7844 7654 7839 7900 7902 7934

DEPTNO 20 30 30 20 30 10 30 30 10 30 20 10

YEAR FROM P3 TO F1 1980 1 1981 2 1981 3 1981 4 1981 5 1981 5 1981 5 1981 5 1981 5 1981 5 1981 4 1982 1 Deivid Bitti Padilha

FROM PU TO C FROM P2 TO P1 1 0 1 0 2 1 3 2 4 3 5 3 6 3 7 3 8 3 9 3 10 3 1 0 Entendendo Oracle Analytic functions

FROM F1 TO F3 0 3 3 3 3 3 3 3 2 1 oracle 0 0

Sumario Introducao Denicoes Funcoes. Conclusao.

ROW NUMBER, RANK e DENSE RANK LEAD e LAG FIRST VALUE e LAST VALUE Funcao FIRST e LAST Especicando <Window Clause> Ordem de computacao e dicas de performance.

Window tipo ROW. Exemplo


A coluna FROM PU TO C mostra um exemplo onde o ponto de incio da window e antes da linha corrente e o ponto de m e a linha corrente. Esta coluna talvez tenha alguma signicancia no mundo real, pode ser entendida como o acumulo anual de empregados de uma empresa na medida que contratacoes sao feitas. A coluna FROM P2 TO P1 mostra um exemplo onde tanto o ponto de incio e o ponto de m da window estao posicionados antes da linha corrente. A coluna FROM F1 TO F3 mostra um exemplo onde o ponto de incio e m da window estao apos a linha corrente, o oposto da coluna anterior. Observe que a quantidade diminui oracle no nal.
Deivid Bitti Padilha Entendendo Oracle Analytic functions

Sumario Introducao Denicoes Funcoes. Conclusao.

ROW NUMBER, RANK e DENSE RANK LEAD e LAG FIRST VALUE e LAST VALUE Funcao FIRST e LAST Especicando <Window Clause> Ordem de computacao e dicas de performance.

Window tipo RANGE.


Para windows do tipo RANGE a sintaxe geral e a mesma para as do tipo ROW: Function( ) OVER (PARTITION BY <expr1> ORDER BY <expr2> RANGE BETWEEN <start expr> AND <end expr>) OU Function( ) OVER (PARTITION BY <expr1> ORDER BY <expr2> RANGE [<start expr> PRECEDING or UNBOUNDED PRECEDING] Para <start expr> ou <end expr> nos podemos usar UNBOUNDED PECEDING, CURRENT ROW ou <sql expr> PRECEDING ou FOLLOWING. Entretando, para Window tipo RANGE <sql expr> deve retornar um valor compatvel com a expressao do ORDER BY (<expr2>), <sql expr> e um offset logico. Deve ser uma constante, uma expressao que resulta em um valor numerico positivo ou um intervalo literal. Apenas uma expressao ORDER BY e permitida. ao Se <sql expr> resultar em um valor numerico ent a expressao do ORDER BY deve ser do tipo numerico ou DATE. Se <sql expr> resultar em um valor de intervalo, ent ao ORDER BY deve ser do tipo DATE. Observe no exemplo do proximo slide (Query-11) que usa window do tipo RANGE. Devemos sempre ter em mente que o tamanho da janela em termos de numero de registros pode variar.
Deivid Bitti Padilha Entendendo Oracle Analytic functions oracle

Sumario Introducao Denicoes Funcoes. Conclusao.

ROW NUMBER, RANK e DENSE RANK LEAD e LAG FIRST VALUE e LAST VALUE Funcao FIRST e LAST Especicando <Window Clause> Ordem de computacao e dicas de performance.

Window tipo RANGE. Exemplo


Para cada empregado dos departamentos 20 e 30, precisamos saber quandos empregados ganham menos da metade e quantos ganham mais que o dobro do empregado em questao. SELECT DEPTNO,EMPNO,SAL, COUNT (1) OVER (PARTITION BY DEPTNO ORDER BY SAL RANGE BETWEEN UNBOUNDED PRECEDING AND (SAL/ 2) PRECEDING) AS CNT LT HALF, COUNT (1) OVER (PARTITION BY DEPTNO ORDER BY SAL RANGE BETWEEN (SAL / 2) FOLLOWING AND UNBOUNDED FOLLOWING) AS CNT MT HALF FROM SCOTT.EMP WHERE DEPTNO IN (20, 30) ORDER BY DEPTNO,SAL DEPTNO 20 20 20 20 20 30 30 30 30 30 30 Query-11 Deivid Bitti Padilha Entendendo Oracle Analytic functions EMPNO 7369 7876 7566 7788 7902 7900 7521 7654 7844 7499 7698 SAL 800 1100 2975 3000 3000 950 1250 1250 1500 1600 2850 CNT LT HALF 0 0 2 2 2 0 0 0 0 0 3 CNT MT HALF 3 3 0 0 0 3 1 1 1 1 0

oracle

Sumario Introducao Denicoes Funcoes. Conclusao.

ROW NUMBER, RANK e DENSE RANK LEAD e LAG FIRST VALUE e LAST VALUE Funcao FIRST e LAST Especicando <Window Clause> Ordem de computacao e dicas de performance.

Denindo as clausulas PARTITION BY e ORDER BY para colunas indexadas (ordenadas de acordo com PARTITION e entao ORDER BY na FA) ira promover excelente performance. Na Query-5, por exemplo, um ndice composto contendo as colunas DEPNO e HIREDATE talvez teria uma melhoria de performance. Mesmo na ausencia dos ndices as funcoes analticas fornecem o desempenho aceitavel mas existe a necessidade fazer a classicacao para a clausula PARTITION BY e ORDER BY. Se a query contiver funcoes analticas multiplas, classicar e particionar em duas colunas diferentes deve ser evitado caso as duas nao forem indexadas.
oracle

Deivid Bitti Padilha

Entendendo Oracle Analytic functions

Sumario Introducao Denicoes Funcoes. Conclusao.

Referencias

Sumario
1

2 3

Introducao O que e ? Vantagens. Sintaxe. Denicoes No que diferencia das demais funcoes de agregacao ? Funcoes. ROW NUMBER, RANK e DENSE RANK LEAD e LAG FIRST VALUE e LAST VALUE Funcao FIRST e LAST Especicando <Window Clause> Ordem de computacao e dicas de performance. Conclusao. Entendendo Oracle Analytic functions Referencias Deivid Bitti Padilha

oracle

Sumario Introducao Denicoes Funcoes. Conclusao.

Referencias

Como pudemos observar nesta leitura, o mundo do SQL do Oracle e muito mais amplo do que se imagina, indo muito alem dos velhos comandos conhecidos (SELECT, FROM, WHERE, HAVING,..etc) o importante para quem escreve comandos SQL e que se saiba o poder que temos em nossas maos. O uso de funcoes analticas nativas do Oracle nos permite tratar problemas complexos com extrema performance, de maneira ecaz e exvel com um codigo elegante e legvel (claro, legvel para quem entende). E espero que agora voce entenda.

oracle

Deivid Bitti Padilha

Entendendo Oracle Analytic functions

Sumario Introducao Denicoes Funcoes. Conclusao.

Referencias

Referencias - Nada se cria, tudo se transforma.


Shouvik Basu - Analytic functions by Example, November 15, 2004 http://www.orafaq.com/articles/archives/000060.htm Oracle Documentation http://www.oracle.com/pls/db102/homepage http://www.akadia.com/services/ora analytic functions.html http://www.psoug.org/reference/analytic functions.html A. Billington - Introduction to 8i Analytic Functions http://www.revealnet.com/newsletter-v3/0402 D.htm
A Esta apresentacao foi feita utilizando a classe Beamer, com o poderoso LTEX. oracle

Deivid Bitti Padilha

Entendendo Oracle Analytic functions