Oracle SQL Analytics

40
oracle Sum ´ ario Introduc ¸˜ ao Definic ¸˜ oes Func ¸˜ oes. Conclus ˜ ao. Entendendo Oracle Analytic functions Deivid Bitti Padilha 2012 Deivid Bitti Padilha Entendendo Oracle Analytic functions

description

´ Sumario Introducao ¸˜ Definicoes ¸˜ Funcoes. ¸˜ ˜ Conclusao.Entendendo Oracle Analytic functionsDeivid Bitti Padilha2012oracleDeivid Bitti PadilhaEntendendo Oracle Analytic functions´ Sumario Introducao ¸˜ Definicoes ¸˜ Funcoes. ¸˜ ˜ Conclusao.1234Introducao ¸˜ ´ O que e ? Vantagens. Sintaxe. Definicoes ¸˜ 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 ¸˜ Especifican

Transcript of Oracle SQL Analytics

Page 1: Oracle SQL Analytics

oracle

SumarioIntroduc aoDefinic oes

Func oes.Conclus ao.

Entendendo Oracle Analytic functions

Deivid Bitti Padilha

2012

Deivid Bitti Padilha Entendendo Oracle Analytic functions

Page 2: Oracle SQL Analytics

oracle

SumarioIntroduc aoDefinic oes

Func oes.Conclus ao.

1 Introduc aoO que e ?Vantagens.Sintaxe.

2 Definic oesNo que diferencia das demais funcoes de agregacao ?

3 Func oes.ROW NUMBER, RANK e DENSE RANKLEAD e LAGFIRST VALUE e LAST VALUEFuncao FIRST e LASTEspecificando <Window Clause>Ordem de computacao e dicas de performance.

4 Conclus ao.Referencias

Deivid Bitti Padilha Entendendo Oracle Analytic functions

Page 3: Oracle SQL Analytics

oracle

SumarioIntroduc aoDefinic oes

Func oes.Conclus ao.

O que e ?Vantagens.Sintaxe.

Sumario1 Introduc ao

O que e ?Vantagens.Sintaxe.

2 Definic oesNo que diferencia das demais funcoes de agregacao ?

3 Func oes.ROW NUMBER, RANK e DENSE RANKLEAD e LAGFIRST VALUE e LAST VALUEFuncao FIRST e LASTEspecificando <Window Clause>Ordem de computacao e dicas de performance.

4 Conclus ao.Referencias Deivid Bitti Padilha Entendendo Oracle Analytic functions

Page 4: Oracle SQL Analytics

oracle

SumarioIntroduc aoDefinic oes

Func oes.Conclus ao.

O que e ?Vantagens.Sintaxe.

O que e ?

Funcoes analıticas (FA) sao um conjunto de comandos econceitos que permitem computar um valor agregado baseadoem um conjunto de linhas.Normalmente, muitas funcionalidades que sao fornecidasnativamente sao feitas na “mao”, utilizando comandos SQLpadrao com joins, subqueries, clausula WITH, etc. Porem,utilizar FA traz muitas vantagens.

Deivid Bitti Padilha Entendendo Oracle Analytic functions

Page 5: Oracle SQL Analytics

oracle

SumarioIntroduc aoDefinic oes

Func oes.Conclus ao.

O que e ?Vantagens.Sintaxe.

Vantagens do uso de Func oes Analıticas

Tendo o problema resolvido atraves de FA e, na maioriadas vezes, muito mais performatico do que utilizandofuncoes padroes.

O comando SQL, normalmente fica menor,consequentemente mais legıvel e de facil depuracao eteste.

Algumas funcionalidades das FA so poderiam sersubstituıdas atraves do uso de procedimentos PL/SQL.

Deivid Bitti Padilha Entendendo Oracle Analytic functions

Page 6: Oracle SQL Analytics

oracle

SumarioIntroduc aoDefinic oes

Func oes.Conclus ao.

O que e ?Vantagens.Sintaxe.

Vantagens do uso de Func oes Analıticas

Tendo o problema resolvido atraves de FA e, na maioriadas vezes, muito mais performatico do que utilizandofuncoes padroes.

O comando SQL, normalmente fica menor,consequentemente mais legıvel e de facil depuracao eteste.

Algumas funcionalidades das FA so poderiam sersubstituıdas atraves do uso de procedimentos PL/SQL.

Deivid Bitti Padilha Entendendo Oracle Analytic functions

Page 7: Oracle SQL Analytics

oracle

SumarioIntroduc aoDefinic oes

Func oes.Conclus ao.

O que e ?Vantagens.Sintaxe.

Vantagens do uso de Func oes Analıticas

Tendo o problema resolvido atraves de FA e, na maioriadas vezes, muito mais performatico do que utilizandofuncoes padroes.

O comando SQL, normalmente fica menor,consequentemente mais legıvel e de facil depuracao eteste.

Algumas funcionalidades das FA so poderiam sersubstituıdas atraves do uso de procedimentos PL/SQL.

Deivid Bitti Padilha Entendendo Oracle Analytic functions

Page 8: Oracle SQL Analytics

oracle

SumarioIntroduc aoDefinic oes

Func oes.Conclus ao.

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.

Deivid Bitti Padilha Entendendo Oracle Analytic functions

Page 9: Oracle SQL Analytics

oracle

SumarioIntroduc aoDefinic oes

Func oes.Conclus ao.

No que diferencia das demais func oes de agregac ao ?

Sumario1 Introduc ao

O que e ?Vantagens.Sintaxe.

2 Definic oesNo que diferencia das demais funcoes de agregacao ?

3 Func oes.ROW NUMBER, RANK e DENSE RANKLEAD e LAGFIRST VALUE e LAST VALUEFuncao FIRST e LASTEspecificando <Window Clause>Ordem de computacao e dicas de performance.

4 Conclus ao.Referencias Deivid Bitti Padilha Entendendo Oracle Analytic functions

Page 10: Oracle SQL Analytics

oracle

SumarioIntroduc aoDefinic oes

Func oes.Conclus ao.

No que diferencia das demais func oes de agregac ao ?

Sem func oes analıticas...

Observe o SQL abaixo seguido por seu resultado:

SELECT DEPTNO,COUNT (1) AS DEPT COUNTFROM SCOTT.EMPWHERE DEPTNO IN (20, 30)GROUP BY DEPTNO;

DEPTNO DEPT COUNT30 620 5

Query-1

Como podemos obervar naQuery-1 retorna departamentoscom quantidade de funcionarios. Como sabemos, colunas quenao estao na clausula GROUP BY nao podem ser incluıdas noSELECT.

Deivid Bitti Padilha Entendendo Oracle Analytic functions

Page 11: Oracle SQL Analytics

oracle

SumarioIntroduc aoDefinic oes

Func oes.Conclus ao.

No que diferencia das demais func oes de agregac ao ?

Com func oes analıticas...

SELECT EMPNO,DEPTNO,COUNT (1) OVER (PARTITION BYDEPTNO) AS DEPT COUNTFROM SCOTT.EMPWHERE DEPTNO IN (20, 30);

EMPNO DEPTNO DEPT COUNT7369 20 57876 20 57566 20 57788 20 57902 20 57900 30 67844 30 67654 30 67521 30 67499 30 67698 30 6

Query-2

Ja na Query-2 que utiliza FA, conseguimos trazer o totaljuntamente com todas as linhas.

Deivid Bitti Padilha Entendendo Oracle Analytic functions

Page 12: Oracle SQL Analytics

oracle

SumarioIntroduc aoDefinic oes

Func oes.Conclus ao.

No que diferencia das demais func oes de agregac ao ?

Considerac oes.

Como observado, a principal diferenca entre funcoes deagregacao e FA e que uma agrupa o resultado e a outra nao.Utilizando FA, o totalizador se repete para cada registro doresultado, e assim como em qualquer SQL sem “GROUP BY”,qualquer coluna ou expressao pode ser inserida na clausulaSELECT, como por exemplo a coluna DEPNO na Query-2 .

As Funcoes Analıticas sao computadas apos todos os JOINS,clausula WHERE, GROUP BY e HAVING presentes naconsulta. O ORDER BY principal e feito apos a FA, desta formacolunas de FA podem aparecer no ORDER BY principal.

Caso o comando PARTITION e <window clause> for omitidodentro de OVER() sera computado todos os registros limitadospela clausula WHERE. Observe os resultados da Query-3 ecompare com a Query-4 .

Deivid Bitti Padilha Entendendo Oracle Analytic functions

Page 13: Oracle SQL Analytics

oracle

SumarioIntroduc aoDefinic oes

Func oes.Conclus ao.

No que diferencia das demais func oes de agregac ao ?

Considerac oes.

Como observado, a principal diferenca entre funcoes deagregacao e FA e que uma agrupa o resultado e a outra nao.Utilizando FA, o totalizador se repete para cada registro doresultado, e assim como em qualquer SQL sem “GROUP BY”,qualquer coluna ou expressao pode ser inserida na clausulaSELECT, como por exemplo a coluna DEPNO na Query-2 .

As Funcoes Analıticas sao computadas apos todos os JOINS,clausula WHERE, GROUP BY e HAVING presentes naconsulta. O ORDER BY principal e feito apos a FA, desta formacolunas de FA podem aparecer no ORDER BY principal.

Caso o comando PARTITION e <window clause> for omitidodentro de OVER() sera computado todos os registros limitadospela clausula WHERE. Observe os resultados da Query-3 ecompare com a Query-4 .

Deivid Bitti Padilha Entendendo Oracle Analytic functions

Page 14: Oracle SQL Analytics

oracle

SumarioIntroduc aoDefinic oes

Func oes.Conclus ao.

No que diferencia das demais func oes de agregac ao ?

Considerac oes.

Como observado, a principal diferenca entre funcoes deagregacao e FA e que uma agrupa o resultado e a outra nao.Utilizando FA, o totalizador se repete para cada registro doresultado, e assim como em qualquer SQL sem “GROUP BY”,qualquer coluna ou expressao pode ser inserida na clausulaSELECT, como por exemplo a coluna DEPNO na Query-2 .

As Funcoes Analıticas sao computadas apos todos os JOINS,clausula WHERE, GROUP BY e HAVING presentes naconsulta. O ORDER BY principal e feito apos a FA, desta formacolunas de FA podem aparecer no ORDER BY principal.

Caso o comando PARTITION e <window clause> for omitidodentro de OVER() sera computado todos os registros limitadospela clausula WHERE. Observe os resultados da Query-3 ecompare com a Query-4 .

Deivid Bitti Padilha Entendendo Oracle Analytic functions

Page 15: Oracle SQL Analytics

oracle

SumarioIntroduc aoDefinic oes

Func oes.Conclus ao.

No que diferencia das demais func oes de agregac ao ?

OVER().

SELECT EMPNO,DEPTNO,COUNT (1) OVER () AS TOTALFROM SCOTT.EMPWHERE DEPTNO IN (20, 30) ORDERBY 1,2;

EMPNO DEPTNO TOTAL7782 10 87839 10 87934 10 87369 20 87566 20 87788 20 87876 20 87902 20 8

Query-3

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

TOTAL8

Query-4

Deivid Bitti Padilha Entendendo Oracle Analytic functions

Page 16: Oracle SQL Analytics

oracle

SumarioIntroduc aoDefinic oes

Func oes.Conclus ao.

No que diferencia das demais func oes de agregac ao ?

Como quebrar o resultado em um conjunto degrupos ou partic oes?

Como vimos nos exemplos anteriores, ficou obvio que e aclausula PARTITION BY que determina o criterio de quebra.

Algumas funcoes suportam <window clause> dentro daparticao para limitar os registros compreendidos, caso<window clause> for omitido a FA ira computar todos osregistros da particao.

As funcoes SUM, COUNT, AVG, MIN e MAX sao funcoesanalıticas que nao dependem da ordem dos elementos dentroda particao.

Funcoes como LEAD, LAG, RANK, DENSE RANK,ROW NUMBER, FIRST, FIRST VALUE, LAST e LAST VALUEnos proximos exemplos veremos como isso e utilizado.

Deivid Bitti Padilha Entendendo Oracle Analytic functions

Page 17: Oracle SQL Analytics

oracle

SumarioIntroduc aoDefinic oes

Func oes.Conclus ao.

No que diferencia das demais func oes de agregac ao ?

Como ordenar os registros dentro de umapartic ao?

A resposta e simples, utilizando a clausula “ORDER BY” dentro daclausula OVER(). Esta e a diferenca entre o ORDER BY principalque vem apos o WHERE. Nas proximas secoes, veremos cada umadas funcoes mais utilizadas: LEAD, LAG, RANK, DENSE RANK,ROW NUMBER, FIRST, FIRST VALUE, LAST, LAST VALUE eentenderemos 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.).

Deivid Bitti Padilha Entendendo Oracle Analytic functions

Page 18: Oracle SQL Analytics

oracle

SumarioIntroduc aoDefinic oes

Func oes.Conclus ao.

ROW NUMBER, RANK e DENSE RANKLEAD e LAGFIRST VALUE e LAST VALUEFunc ao FIRST e LASTEspecificando <Window Clause>

Ordem de computac ao e dicas de performance.

Sumario1 Introduc ao

O que e ?Vantagens.Sintaxe.

2 Definic oesNo que diferencia das demais funcoes de agregacao ?

3 Func oes.ROW NUMBER, RANK e DENSE RANKLEAD e LAGFIRST VALUE e LAST VALUEFuncao FIRST e LASTEspecificando <Window Clause>Ordem de computacao e dicas de performance.

4 Conclus ao.Referencias Deivid Bitti Padilha Entendendo Oracle Analytic functions

Page 19: Oracle SQL Analytics

oracle

SumarioIntroduc aoDefinic oes

Func oes.Conclus ao.

ROW NUMBER, RANK e DENSE RANKLEAD e LAGFIRST VALUE e LAST VALUEFunc ao FIRST e LASTEspecificando <Window Clause>

Ordem de computac ao e dicas de performance.

Estas tres funcoes associam umvalor inteiro a linha dependendoda sua ordem, e por esse motivoque serao mostradas na mesmasecao.

Deivid Bitti Padilha Entendendo Oracle Analytic functions

Page 20: Oracle SQL Analytics

oracle

SumarioIntroduc aoDefinic oes

Func oes.Conclus ao.

ROW NUMBER, RANK e DENSE RANKLEAD e LAGFIRST VALUE e LAST VALUEFunc ao FIRST e LASTEspecificando <Window Clause>

Ordem de computac ao e dicas de performance.

ROW NUMBER( )

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

Deivid Bitti Padilha Entendendo Oracle Analytic functions

Page 21: Oracle SQL Analytics

oracle

SumarioIntroduc aoDefinic oes

Func oes.Conclus ao.

ROW NUMBER, RANK e DENSE RANKLEAD e LAGFIRST VALUE e LAST VALUEFunc ao FIRST e LASTEspecificando <Window Clause>

Ordem de computac ao e dicas de performance.

ROW NUMBER( ) - Exemplo

SELECT EMPNO, DEPTNO, HIRE-DATE,ROW NUMBER () OVER (PARTITIONBY DEPTNO ORDER BY HIREDATENULLS LAST ) AS ORDEMFROM SCOTT.EMPWHERE DEPTNO IN (10, 20)ORDER BY DEPTNO, ORDEM

EMPNO DEPTNO HIREDATE ORDEM7782 10 09/06/81 17839 10 17/11/81 27934 10 23/01/82 37369 20 17/12/80 17566 20 02/04/81 27902 20 03/12/81 37788 20 19/04/87 47876 20 23/05/87 5

Query-5

Como podemos observar na Query-5 , a coluna ORDEMcontem a ordem de contratacao do empregado, pordepartamento.

Deivid Bitti Padilha Entendendo Oracle Analytic functions

Page 22: Oracle SQL Analytics

oracle

SumarioIntroduc aoDefinic oes

Func oes.Conclus ao.

ROW NUMBER, RANK e DENSE RANKLEAD e LAGFIRST VALUE e LAST VALUEFunc ao FIRST e LASTEspecificando <Window Clause>

Ordem de computac ao e dicas de performance.

RANK() e DENSE RANK()

Tanto RANK() quanto DENSE RANK() exibem a posicao doregistro baseado em valores de colunas ou expressoes. Casoexita 2 registros na posicao N, RANK() declara duas posicoesN, ignora a posicao N+1 e atribui a posicao N+2 ao proximoregistro. Ja DENSE RANK() declara duas posicoes N mas naoignora a posicao N+1.Para entendermos melhor, vejamos o exemplo no proximoslide.

Deivid Bitti Padilha Entendendo Oracle Analytic functions

Page 23: Oracle SQL Analytics

oracle

SumarioIntroduc aoDefinic oes

Func oes.Conclus ao.

ROW NUMBER, RANK e DENSE RANKLEAD e LAGFIRST VALUE e LAST VALUEFunc ao FIRST e LASTEspecificando <Window Clause>

Ordem de computac ao e dicas de performance.

RANK() e DENSE RANK() - Exemplo

SELECT EMPNO,DEPTNO,SAL,RANK () OVER (PARTITION BY DEPTNO ORDERBY SAL DESC NULLS LAST ) RANK,DENSE RANK () OVER (PARTITION BY DEPTNOORDER BY SAL DESC NULLS LAST ) D RANKFROM SCOTT.EMPWHERE DEPTNO IN (10, 20)ORDER BY 2,RANK;

EMPNO DEPTNO SAL RANK D RANK7839 10 5000 1 17782 10 2450 2 27934 10 1300 3 37788 20 3000 1 17902 20 3000 1 17566 20 2975 3 27876 20 1100 4 37369 20 800 5 4

Query-6

Na Query-6 vemos o uso de RANK() e DENSE RANK(). Para oDEPTNO 20, teremos dois registros na primeira posicao (EMPNO7788 and 7902). Tanto RANK() quanto DENSE RANK() exibira osregistros no topo. RANK() ignora o proximo valor que e 2, sendoassim o proximo empregado (EMPNO 7566) e colocado na posicao3, ja com DENSE RANK() isso nao acontece.

Deivid Bitti Padilha Entendendo Oracle Analytic functions

Page 24: Oracle SQL Analytics

oracle

SumarioIntroduc aoDefinic oes

Func oes.Conclus ao.

ROW NUMBER, RANK e DENSE RANKLEAD e LAGFIRST VALUE e LAST VALUEFunc ao FIRST e LASTEspecificando <Window Clause>

Ordem de computac ao e dicas de performance.

LEAD e LAG

LEAD tem a habilidade de computar uma expressao nasproximas linhas (linhas existentes apos a linha corrente) eretorna o valor para a linha corrente.A sintaxe do LAG e similar a do LEAD, a diferenca e que o LAGcomputa linhas anteriores a linha corrente. A sintaxe do LEADou LAG e a seguinte:

LEAD | LAG (<sql expr>, <offset>, <default>) OVER(<analytic clause>)<sql expr> E a expressao SQL a ser calculada na linha em questao.<offset> e o indice relativo a linha atual das linhas posteriores no caso do LEAD ouanteriores 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

Page 25: Oracle SQL Analytics

oracle

SumarioIntroduc aoDefinic oes

Func oes.Conclus ao.

ROW NUMBER, RANK e DENSE RANKLEAD e LAGFIRST VALUE e LAST VALUEFunc ao FIRST e LASTEspecificando <Window Clause>

Ordem de computac ao e dicas de performance.

LEAD e LAG - Exemplo

SELECT DEPTNO, EMPNO, SAL,LEAD (SAL, 1, 0) OVER (PARTITION BY DEPTNO ORDER BY SAL DESC NULLSLAST ) AS NEXT LOWER SAL,LAG (SAL, 1, 0) OVER (PARTITION BY DEPTNO ORDER BY SAL DESC NULLSLAST ) AS PREV HIGHER SALFROM SCOTT.EMPWHERE DEPTNO IN (10, 20)ORDER BY DEPTNO, SAL DESC

DEPTNO EMPNO SAL NEXT LOWER SAL PREV HIGHER SAL10 7839 5000 2450 010 7782 2450 1300 500010 7934 1300 0 245020 7788 3000 3000 020 7902 3000 2975 300020 7566 2975 1100 300020 7876 1100 800 297520 7369 800 0 1100

Query-7

Deivid Bitti Padilha Entendendo Oracle Analytic functions

Page 26: Oracle SQL Analytics

oracle

SumarioIntroduc aoDefinic oes

Func oes.Conclus ao.

ROW NUMBER, RANK e DENSE RANKLEAD e LAGFIRST VALUE e LAST VALUEFunc ao FIRST e LASTEspecificando <Window Clause>

Ordem de computac ao e dicas de performance.

FIRST VALUE e LAST VALUE

A funcao FIRST VALUE seleciona o primeiro registro daparticao apos a execucao do ORDER BY. A expressao SQL<sql expr> e computada nas colunas do primeiro registro e oseu resultado e retornado. A funcao LAST VALUE e usado emum contexto similar, sendo que a expressao e executada sob oultimo registro da particao. A sintaxe e :

FIRST VALUE|LAST VALUE(<sql expr>) OVER(<analytic clause>)

Deivid Bitti Padilha Entendendo Oracle Analytic functions

Page 27: Oracle SQL Analytics

oracle

SumarioIntroduc aoDefinic oes

Func oes.Conclus ao.

ROW NUMBER, RANK e DENSE RANKLEAD e LAGFIRST VALUE e LAST VALUEFunc ao FIRST e LASTEspecificando <Window Clause>

Ordem de computac ao e dicas de performance.

FIRST VALUE - Exemplo

Quantos dias entre a contratacao do primeiro empregado e oempregado correspondente de cada departamento:SELECT EMPNO,DEPTNO,HIREDATE - FIRST VALUE (HIREDATE) OVER (PARTITION BY DEPTNO ORDER BY HIREDATE) AS DAY GAPFROM SCOTT.EMPWHERE DEPTNO IN (20, 30)ORDER BY DEPTNO, DAY GAP

EMPNO DEPTNO DAY GAP7369 20 07566 20 1067788 20 23147876 20 23487902 20 3517499 30 07521 30 27844 30 2007654 30 2207900 30 2867698 30 70

Query-8

Deivid Bitti Padilha Entendendo Oracle Analytic functions

Page 28: Oracle SQL Analytics

oracle

SumarioIntroduc aoDefinic oes

Func oes.Conclus ao.

ROW NUMBER, RANK e DENSE RANKLEAD e LAGFIRST VALUE e LAST VALUEFunc ao FIRST e LASTEspecificando <Window Clause>

Ordem de computac ao e dicas de performance.

Func ao FIRST e LAST

A funcao FIRST (ou mais propriamente KEEP FIRST) e usado em situacoes muitoespeciais. Suponha que nos criamos um Rank de um grupo de registros eencontramos varios registros na primeira posicao. Agora nos precisamos aplicar umafuncao 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

analıticas. Tais funcoes nao tem 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

Page 29: Oracle SQL Analytics

oracle

SumarioIntroduc aoDefinic oes

Func oes.Conclus ao.

ROW NUMBER, RANK e DENSE RANKLEAD e LAGFIRST VALUE e LAST VALUEFunc ao FIRST e LASTEspecificando <Window Clause>

Ordem de computac ao e dicas de performance.

Func ao FIRST - Exemplo

Como comparar o salario de cada empregado com a mediasalarial 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 (PARTITIONBY DEPTNO)) AS AVG SAL YR1 HIREFROM SCOTT.EMPWHERE DEPTNO IN (20, 10)ORDER BY DEPTNO,EMPNO,HIRE YR

EMPNO DEPTNO HIRE YR SAL AVG SAL YR1 HIRE7782 10 1981 2450 37257839 10 1981 5000 37257934 10 1982 1300 37257369 20 1980 800 8007566 20 1981 2975 8007788 20 1987 3000 8007876 20 1987 1100 8007902 20 1981 3000 800

Query-9

Deivid Bitti Padilha Entendendo Oracle Analytic functions

Page 30: Oracle SQL Analytics

oracle

SumarioIntroduc aoDefinic oes

Func oes.Conclus ao.

ROW NUMBER, RANK e DENSE RANKLEAD e LAGFIRST VALUE e LAST VALUEFunc ao FIRST e LASTEspecificando <Window Clause>

Ordem de computac ao e dicas de performance.

Como especificar <Window Clause>?

Algumas funcoes analıticas ja discutidas (AVG, COUNT, FIRST VALUE, LAST VALUE,MAX, MIN e SUM) podem ter uma clausula “window” para sub-particionar o resultadoe aplicar a funcao. Uma importante funcionalidade da clausula “window” e que ela edinamica 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

Page 31: Oracle SQL Analytics

oracle

SumarioIntroduc aoDefinic oes

Func oes.Conclus ao.

ROW NUMBER, RANK e DENSE RANKLEAD e LAGFIRST VALUE e LAST VALUEFunc ao FIRST e LASTEspecificando <Window Clause>

Ordem de computac ao e dicas de performance.

<Window Clause> Continuac ao...

Para “windows” do tipo ROW, a definicao e em termos de numeros de linhasanteriores ou posteriores a linha corrente, sendo assim para esse tipo <sql expr>deve retornar um inteiro positivo.Para “windows” do tipo RANGE, a definicao e em termos de valores anteriores ouposteriores a ORDEM corrente. Veremos isso com detalhes nos proximos slides.“Windows” ROW ou RANGE nao podem aparecer juntas em uma clausula OVER, maspodem ou nao incluir a linha corrente. O ponto de inıcio e o ponto de fim da “window”podem terminar antes ou apos a linha corrente. Entretanto o ponto de inıcio nao podevir apos o ponto de fim da “window”. Caso os pontos de limitacao da “window” naoforem definidos, os valores default sao : UNBOUNDED PRECEDING para<start expr> e UNBOUNDED FOLLOWING para <end expr>.Se o ponto de fim for a linha corrente, a sintaxe apenas para o ponto de inıcio podeser:[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

Page 32: Oracle SQL Analytics

oracle

SumarioIntroduc aoDefinic oes

Func oes.Conclus ao.

ROW NUMBER, RANK e DENSE RANKLEAD e LAGFIRST VALUE e LAST VALUEFunc ao FIRST e LASTEspecificando <Window Clause>

Ordem de computac ao e dicas de performance.

“Window” tipo ROW.

Para funcoes analıticas com “Window” tipo ROW, a sintaxe geral e:

Function( ) OVER (PARTITION BY <expr1> ORDER BY <expr2,..> ROWSBETWEEN <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 efeita em termos de numero de registros.A consulta do proximo slide (Query-10) ilustra o uso de varias clausulas “window” coma funcao COUNT(1). O COUNT simplesmente mostra o numero de linhas dentro dadefinicao da “window”. Observe os valores para cada coluna no ano 1981.

A coluna FROM P3 TO F1 mostra um exemplo onde o ponto de inıcio da “window” e

anterior a linha corrente e o ponto de fim e apos a linha corrente, essa e uma janela de

5 linhas, como observado mostra valores menores do que 5 entre o inıcio e o fim do

“scroll”.

Deivid Bitti Padilha Entendendo Oracle Analytic functions

Page 33: Oracle SQL Analytics

oracle

SumarioIntroduc aoDefinic oes

Func oes.Conclus ao.

ROW NUMBER, RANK e DENSE RANKLEAD e LAGFIRST VALUE e LAST VALUEFunc ao FIRST e LASTEspecificando <Window Clause>

Ordem de computac ao e dicas de performance.

“Window” tipo ROW. ExemploSELECT EMPNO,DEPTNO, TO CHAR (HIREDATE, ’YYYY’) AS YEAR,COUNT (1) OVER (PARTITION BY TO CHAR (HIREDATE, ’YYYY’) ORDER BY HIREDATE ROWS BETWEEN 3PRECEDING AND 1 FOLLOWING ) AS FROM P3 TO F1,COUNT (1) OVER (PARTITION BY TO CHAR (HIREDATE, ’YYYY’) ORDER BY HIREDATE ROWS BETWEENUNBOUNDED PRECEDING AND CURRENT ROW ) AS FROM PU TO C,COUNT (1) OVER (PARTITION BY TO CHAR (HIREDATE, ’YYYY’) ORDER BY HIREDATE ROWS BETWEEN 3PRECEDING AND 1 PRECEDING) AS FROM P2 TO P1,COUNT (1) OVER (PARTITION BY TO CHAR (HIREDATE, ’YYYY’) ORDER BY HIREDATE ROWS BETWEEN 1FOLLOWING AND 3 FOLLOWING ) AS FROM F1 TO F3FROM SCOTT.EMPORDER BY HIREDATE

Query-10EMPNO DEPTNO YEAR FROM P3 TO F1 FROM PU TO C FROM P2 TO P1 FROM F1 TO F3

7369 20 1980 1 1 0 07499 30 1981 2 1 0 37521 30 1981 3 2 1 37566 20 1981 4 3 2 37698 30 1981 5 4 3 37782 10 1981 5 5 3 37844 30 1981 5 6 3 37654 30 1981 5 7 3 37839 10 1981 5 8 3 27900 30 1981 5 9 3 17902 20 1981 4 10 3 07934 10 1982 1 1 0 0

Deivid Bitti Padilha Entendendo Oracle Analytic functions

Page 34: Oracle SQL Analytics

oracle

SumarioIntroduc aoDefinic oes

Func oes.Conclus ao.

ROW NUMBER, RANK e DENSE RANKLEAD e LAGFIRST VALUE e LAST VALUEFunc ao FIRST e LASTEspecificando <Window Clause>

Ordem de computac ao e dicas de performance.

“Window” tipo ROW. Exemplo

A coluna FROM PU TO C mostra um exemplo onde o ponto deinıcio da “window” e antes da linha corrente e o ponto de fim ea linha corrente. Esta coluna talvez tenha alguma significanciano mundo real, pode ser entendida como o acumulo anual deempregados de uma empresa na medida que contratacoes saofeitas.A coluna FROM P2 TO P1 mostra um exemplo onde tanto oponto de inıcio e o ponto de fim da “window” estaoposicionados antes da linha corrente.A coluna FROM F1 TO F3 mostra um exemplo onde o pontode inıcio e fim da “window” estao apos a linha corrente, ooposto da coluna anterior. Observe que a quantidade diminuino final.

Deivid Bitti Padilha Entendendo Oracle Analytic functions

Page 35: Oracle SQL Analytics

oracle

SumarioIntroduc aoDefinic oes

Func oes.Conclus ao.

ROW NUMBER, RANK e DENSE RANKLEAD e LAGFIRST VALUE e LAST VALUEFunc ao FIRST e LASTEspecificando <Window Clause>

Ordem de computac ao 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> RANGEBETWEEN <start expr> AND <end expr>)OUFunction( ) 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 compatıvel com aexpressao do ORDER BY (<expr2>), <sql expr> e um “offset” logico. Deve ser umaconstante, uma expressao que resulta em um valor numerico positivo ou um intervaloliteral. Apenas uma expressao ORDER BY e permitida.Se <sql expr> resultar em um valor numerico entao a expressao do ORDER BY deveser do tipo numerico ou DATE. Se <sql expr> resultar em um valor de intervalo, entaoORDER 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

Page 36: Oracle SQL Analytics

oracle

SumarioIntroduc aoDefinic oes

Func oes.Conclus ao.

ROW NUMBER, RANK e DENSE RANKLEAD e LAGFIRST VALUE e LAST VALUEFunc ao FIRST e LASTEspecificando <Window Clause>

Ordem de computac ao e dicas de performance.

“Window” tipo RANGE. ExemploPara cada empregado dos departamentos 20 e 30, precisamos saber quandos empregados ganham menos dametade 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 PRECEDINGAND (SAL/ 2) PRECEDING) AS CNT LT HALF,COUNT (1) OVER (PARTITION BY DEPTNO ORDER BY SAL RANGE BETWEEN (SAL / 2) FOLLOWING ANDUNBOUNDED FOLLOWING ) AS CNT MT HALFFROM SCOTT.EMPWHERE DEPTNO IN (20, 30)ORDER BY DEPTNO,SAL

DEPTNO EMPNO SAL CNT LT HALF CNT MT HALF20 7369 800 0 320 7876 1100 0 320 7566 2975 2 020 7788 3000 2 020 7902 3000 2 030 7900 950 0 330 7521 1250 0 130 7654 1250 0 130 7844 1500 0 130 7499 1600 0 130 7698 2850 3 0

Query-11

Deivid Bitti Padilha Entendendo Oracle Analytic functions

Page 37: Oracle SQL Analytics

oracle

SumarioIntroduc aoDefinic oes

Func oes.Conclus ao.

ROW NUMBER, RANK e DENSE RANKLEAD e LAGFIRST VALUE e LAST VALUEFunc ao FIRST e LASTEspecificando <Window Clause>

Ordem de computac ao e dicas de performance.

Definindo as clausulas PARTITION BY e ORDER BY paracolunas indexadas (ordenadas de acordo com PARTITION eentao ORDER BY na FA) ira promover excelente performance.Na Query-5, por exemplo, um ındice composto contendo ascolunas DEPNO e HIREDATE talvez teria uma melhoria deperformance.Mesmo na ausencia dos ındices as funcoes analıticasfornecem o desempenho aceitavel mas existe a necessidadefazer a classificacao para a clausula PARTITION BY e ORDERBY. Se a query contiver funcoes analıticas multiplas, classificare particionar em duas colunas diferentes deve ser evitado casoas duas nao forem indexadas.

Deivid Bitti Padilha Entendendo Oracle Analytic functions

Page 38: Oracle SQL Analytics

oracle

SumarioIntroduc aoDefinic oes

Func oes.Conclus ao.

Referencias

Sumario1 Introduc ao

O que e ?Vantagens.Sintaxe.

2 Definic oesNo que diferencia das demais funcoes de agregacao ?

3 Func oes.ROW NUMBER, RANK e DENSE RANKLEAD e LAGFIRST VALUE e LAST VALUEFuncao FIRST e LASTEspecificando <Window Clause>Ordem de computacao e dicas de performance.

4 Conclus ao.Referencias Deivid Bitti Padilha Entendendo Oracle Analytic functions

Page 39: Oracle SQL Analytics

oracle

SumarioIntroduc aoDefinic oes

Func oes.Conclus ao.

Referencias

Como pudemos observar nesta leitura, o mundo do SQL doOracle e muito mais amplo do que se imagina, indo muito alemdos velhos comandos conhecidos (SELECT, FROM, WHERE,HAVING,..etc) o importante para quem escreve comandos SQLe que se saiba o poder que temos em nossas maos. O uso defuncoes analıticas nativas do Oracle nos permite tratarproblemas complexos com extrema performance, de maneiraeficaz e flexıvel com um codigo elegante e legıvel (claro, legıvelpara quem entende). E espero que agora voce entenda.

Deivid Bitti Padilha Entendendo Oracle Analytic functions

Page 40: Oracle SQL Analytics

oracle

SumarioIntroduc aoDefinic oes

Func oes.Conclus ao.

Referencias

Refer encias - Nada se cria, tudo se transforma.

Shouvik Basu - Analytic functions by Example, November15, 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 Functionshttp://www.revealnet.com/newsletter-v3/0402 D.htm

Esta apresentacao foi feita utilizando a classe Beamer, com o poderoso LATEX.

Deivid Bitti Padilha Entendendo Oracle Analytic functions