Você está na página 1de 15

10/07/12 SQL - Funes Analticas - Bancoobpedia

1/15 intranet.sicoob.com.br/wiki/index.php/SQL_-_Funes_Analticas
SQL - Funes Analticas
De Bancoobpedia
ndice de contedo
1 SQL - Funes Analticas, uma introduo
2 Sintaxe
3 Como as funes analticas diferem das funes de grupo ou agregao?
4 Como especificar a ordem dos registros em uma partio?
5 ROW_NUMBER, RANK and DENSE_RANK
6 LEAD e LAG
7 FIRST VALUE e LAST VALUE
8 Como especificar uma clusula de Janela (tipos ROW/RANGE) ?
9 Janelas do tipo ROW
10 Janelas do tipo RANGE
11 Exemplos (favor contribuir!)
12 Concluso
13 Anexo 1 - DDL
14 Anexo 2 - Links teis
SQL - Funes Analticas, uma introduo
Imaginemos os seguintes cenrios
Temos contratos de financiamento com diversas parcelas e precisamos obter a menor parcela no
paga de cada um dos contratos.
Em uma srie histrica de valores por ano/ms, gostaramos de calcular para cada item da srie o
percentual do seu valor em relao ao item anterior da srie, a soma dos valores desde o incio da
srie, e a mdia entre os valores de cada item em relao aos e dois itens anteriores e aos dois
posteriores, em ordem crescente de ano/ms.
Problemas desta natureza so a principal motivao do uso das funes SQL analticas.
Neste artigo iremos atravs de exemplos introduzir a sintaxe e o poder das funes analticas SQL, cuja
utilizao quase sempre aumenta o desempenho das consultas, com a vantagem adicionar de necessitar
de muito menos esforo de codificao se comparado s tcnicas tradicionais onde no utilizado o
poder das funes SQL analticas.
10/07/12 SQL - Funes Analticas - Bancoobpedia
2/15 intranet.sicoob.com.br/wiki/index.php/SQL_-_Funes_Analticas
Importante: As funes SQL analticas foram adicionadas ao padro ANSI (ISO) na reviso SQL:2003
(http://en.wikipedia.org/wiki/SQL:2003, "Window Functions" ). Algumas das funcionalidades e/ou
funes analticas especficas podem no estar disponveis em algumas verses dos Bancos de Dados
utilizados pelo Sicoob.
Tabelas utilizadas neste artigo:
VEICULO
PLACA CHAR(7)
COR CHAR(20)
TIPO CHAR(20)
ANOFABRICACAO CHAR(4)
DATACOMPRA DATE
VEICULO_IPVA
PLACA CHAR(7)
ANO CHAR(4)
VALOR DECIMAL
(Comandos DDL/DML ao final no Anexo 1)
Sintaxe
A sintaxe geral de uma funo analtica a seguinte:
Function(arg1,..., argn) OVER ( [PARTITION BY <...>] [ORDER BY <....>] [<window_clause>] )
<window_clause> pode ser do tipo "ROW <?>" ou "RANK <?>"
Como as funes analticas diferem das funes de grupo ou
agregao?
10/07/12 SQL - Funes Analticas - Bancoobpedia
3/15 intranet.sicoob.com.br/wiki/index.php/SQL_-_Funes_Analticas
SELECT PLACA,COR,TIPO,COUNT(*) OVER() QTD
FROM VEICULO
ORDER BY 1,2
PLACA COR TIPO QTD
AAAAAAA VERMELHO CARRO 8
BBBBBBB AZUL CARRO 8
CCCCCCC VERMELHO MOTOCICLETA 8
DDDDDDD VERDE MOTOCICLETA 8
EEEEEEE VERMELHO CARRO 8
FFFFFFF AMARELO CAMINHONETE 8
GGGGGGG PRETO MOTOCICLETA 8
HHHHHHH VERDE CAMINHONETE 8
Query-1
A Query-1 retorna a quantidade de veculos. Como do padro SQL, no permitido nenhum campo
no includo na clusula GROUP BY na clusula SELECT.
SELECT PLACA,COR,COUNT(*) OVER (PARTITION BY COR) QTDPORCOR
FROM VEICULO
ORDER BY COR
PLACA COR QTDPORCOR
FFFFFFF AMARELO 1
BBBBBBB AZUL 1
GGGGGGG PRETO 1
HHHHHHH VERDE 2
DDDDDDD VERDE 2
EEEEEEE VERMELHO 3
CCCCCCC VERMELHO 3
AAAAAAA VERMELHO 3
10/07/12 SQL - Funes Analticas - Bancoobpedia
4/15 intranet.sicoob.com.br/wiki/index.php/SQL_-_Funes_Analticas
Query-2
Na Query-2, verificamos que o valor de QTDPORCOR, que um clculo da quantidade de carros por
cor, foi calculado para todo o conjunto de resultados de uma s vez, e foi possvel apresentar este
resultado agrupado em cada um dos registros da tabela.
Esta a maior vantagem das funes analticas. Elas permitem que valores agregados sejam calculados e
disponibilizados mltiplas vezes em diferentes registros. Vemos na Query-2 que no houve a
necessidade do uso da clusula GROUP BY para obtermos o total de veculos por cor.
As funes analticas so computadas aps todos as junes, clusula WHERE, clusulas GROUP BY e
HAVING serem aplicadas aos dados. Apenas a clusula ORDER BY principal opera aps a aplicao
das funes analticas.
Deste modo, funes analticas podem aparecer apenas nos termos das clusulas SELECT e ORDER
BY (no podem, por exemplo, aparecer como termo da clusula WHERE, a no ser claro, se for
utilizado SQL's aninhados).
Na ausncia da clusula PARTITION ou <window_clause> dentro da clusula OVER( ), a funo
analtica age em todo o conjunto de dados retornado pela clusula WHERE.
Compare os resultados retornados pelas Query-3 e pela Query-4.
SELECT PLACA,COR,COUNT(*) OVER() QTD
FROM VEICULO
ORDER BY 1,2
PLACA COR QTD
AAAAAAA VERMELHO 8
BBBBBBB AZUL 8
CCCCCCC VERMELHO 8
DDDDDDD VERDE 8
EEEEEEE VERMELHO 8
10/07/12 SQL - Funes Analticas - Bancoobpedia
5/15 intranet.sicoob.com.br/wiki/index.php/SQL_-_Funes_Analticas
FFFFFFF AMARELO 8
GGGGGGG PRETO 8
HHHHHHH VERDE 8
Query-3
SELECT COUNT(*)
FROM VEICULO
COUNT(*)
8
Query-4
Como realizar quebras por partio?
A clusula PARTITION BY utilizada para informar quais so as regras de criao dos grupos. Como
parmetro podem ser utilizados atributos e/ou funes no analticas aplicadas estes atributos.
Exemplo:
SELECT PLACA,COR,COUNT(*) OVER (PARTITION BY SUBSTRING(COR,1,1)
FROM VEICULO
ORDER BY COR
Algumas funes suportam a clusulas de janela ("<window_clause> ") dentro da clusula OVER, de
modo a criar uma janela de registros para a atuao da funo analtica. Na ausncia de uma "
<window_clause>" os resultados so computados sobre todos os registros da partio (se tiver sido
utilizado a clusula PARTITION), ou sobre todos os registros da query ( se for utilizado a clusula
OVER sem nenhum parmetro).
Algumas funes analticas como SUM, COUNT, AVG, MIN, MAX independem da ordem dos
registros na gerao dos seus resultado.
J algumas funes como LEAD, LAG, RANK, DENSE_RANK, ROW_NUMBER, FIRST, FIRST
VALUE, LAST, LAST VALUE dependem da ordem dos registros de entrada.
10/07/12 SQL - Funes Analticas - Bancoobpedia
6/15 intranet.sicoob.com.br/wiki/index.php/SQL_-_Funes_Analticas
Como especificar a ordem dos registros em uma
partio?
Basta utilizar a clusula ORDER BY dentro da clusula OVER( ). Este ORDER BY tem significado
apenas dentro da funo analtica onde utilizado, diferindo da clusula ORDER BY principal da query.
Veremos a seguir alguns exemplos da sua utilizao em conjunto com as funes LEAD, LAG, RANK,
DENSE_RANK, ROW_NUMBER,, FIRST VALUE e LAST VALUE.
A sintaxe da clusula ORDER BY em uma funo analtica a seguinte:
ORDER BY <sql_expr> [ASC ou DESC] NULLS [FIRST or LAST]
ROW_NUMBER, RANK and DENSE_RANK
ROW_NUMBER( ) gera nmeros sequenciais para uma partio de registros. Muito til em relatrios
onde devemos obter numeraes que reiniciam seus valores a cada quebra de grupo.
Na Query-5, a funo ROW_NUMBER( ) usada para separar o conjunto de dados de veculos por
cor, gerando o sequencial de nmeros pela ordem descendente de placa.
SELECT PLACA,COR,ROW_NUMBER() OVER (PARTITION BY COR ORDER BY
PLACA DESC) SEQ
FROM VEICULO
ORDER BY COR,PLACA
PLACA COR SEQ
FFFFFFF AMARELO 1
BBBBBBB AZUL 1
GGGGGGG PRETO 1
DDDDDDD VERDE 2
10/07/12 SQL - Funes Analticas - Bancoobpedia
7/15 intranet.sicoob.com.br/wiki/index.php/SQL_-_Funes_Analticas
HHHHHHH VERDE 1
AAAAAAA VERMELHO 3
CCCCCCC VERMELHO 2
EEEEEEE VERMELHO 1
Query-5 (ROW_NUMBER)
RANK and DENSE_RANK geram um "rank" de registros. A diferena entre as duas funes se d em
caso de "empates". Se por exemplo 2 registros empatarem em determinada posio "N", RANK coloca
os 2 registros no mesmo rank, e "pula" o que seria o prximo valor do rank para o prximo valor na
ordem. J DENSE_RANK no executa este "pulo". Um exemplo pode ser visto na Query-6.
SELECT PLACA,VALOR,RANK() OVER (ORDER BY VALOR) RANK,DENSE_RANK()
OVER (ORDER BY VALOR) DENSE_RANK
FROM VEICULO_IPVA
WHERE PLACA = 'AAAAAAA'
ORDER BY PLACA,VALOR
PLACA VALOR RANK DENSE_RANK
AAAAAAA 1000 1 1
AAAAAAA 1000 1 1
AAAAAAA 1025 3 2
Query-6 (RANK e DENSE_RANK)
LEAD e LAG
LEAD possui a habilidade de "enxergar" os prximos registros (registros aps o registro corrente). J a
funo LAG tem a habilidade "enxergar" os registros anteriores. LEAD e LAG tem a seguinte sintaxe:
LEAD (<sql_expr>, <offset>, <default>) OVER (<analytic_clause>)
LAG (<sql_expr>, <offset>, <default>) OVER (<analytic_clause>)
<sql_expr> a expresso que ser utilizada no clculo.
<offset> a posio relativa em relao ao registro corrente (o valor default 1)
<default> o valor a retornar se <offset> apontar para algum registro fora da partio
10/07/12 SQL - Funes Analticas - Bancoobpedia
8/15 intranet.sicoob.com.br/wiki/index.php/SQL_-_Funes_Analticas
A Query-7 mostra um exemplo da utilizao das funes LAG e LEAD.
SELECT PLACA,ANO,VALOR,LAG (VALOR,1) OVER (PARTITION BY PLACA ORDER
BY ANO) ANT,LEAD(VALOR,1) OVER (PARTITION BY PLACA ORDER BY ANO) PROX
FROM VEICULO_IPVA
ORDER BY PLACA,ANO,VALOR
PLACA ANO VALOR ANT PROX
AAAAAAA 2010 1000 1000
AAAAAAA 2011 1000 1000 1025
AAAAAAA 2012 1025 1000
BBBBBBB 2010 1110 1125
BBBBBBB 2011 1125 1110 1150
BBBBBBB 2012 1150 1125
CCCCCCC 2011 1200 1210
CCCCCCC 2012 1210 1200
DDDDDDD 2011 1325 1350
DDDDDDD 2012 1350 1325
EEEEEEE 2011 1325 1350
EEEEEEE 2012 1350 1325
FFFFFFF 2011 2000 2100
FFFFFFF 2012 2100 2000
GGGGGGG 2012 500
HHHHHHH 2012 2200
Query-7 (LEAD e LAG)
FIRST VALUE e LAST VALUE
Sintaxe:
10/07/12 SQL - Funes Analticas - Bancoobpedia
9/15 intranet.sicoob.com.br/wiki/index.php/SQL_-_Funes_Analticas
FIRST_VALUE(<sql_expr>) OVER (<analytic_clause>)
A funo analtica FIRST_VALUE retorna o primeiro registro da partio, de acordo com a clusula
ORDER BY . O Valor retornado o resultado da aplicao da expresso <sql_expr> sobre este
primeiro registro. LAST_VALUE utilizado de maneira similar, operando no caso sobre o ltimo valor.
--Mostrar o menor registro de ano para o pagamento de IPVA para cada
--veculo
SELECT PLACA,ANO
FROM (
SELECT PLACA,ANO,FIRST_VALUE (ANO) OVER (PARTITION BY PLACA ORDER BY
ANO) MENORANO
FROM VEICULO_IPVA)
WHERE ANO = MENORANO
ORDER BY PLACA
PLACA COR QTD
AAAAAAA VERMELHO 2010
BBBBBBB VERMELHO 2010
CCCCCCC VERMELHO 2011
DDDDDDD VERMELHO 2011
EEEEEEE VERMELHO 2011
FFFFFFF VERMELHO 2011
GGGGGGG VERMELHO 2012
HHHHHHH VERMELHO 2012
Query-8 (FIRST_VALUE)
Como especificar uma clusula de Janela (tipos
ROW/RANGE) ?
Algumas funes analticas (AVG, COUNT, FIRST_VALUE, LAST_VALUE, MAX, MIN e SUM
por exemplo), podem utilizar janelas para sub-particionar os dados para a aplicao da funo analtica.
Sua caracterstica mais importante a sua natureza dinmica.
10/07/12 SQL - Funes Analticas - Bancoobpedia
10/15 intranet.sicoob.com.br/wiki/index.php/SQL_-_Funes_Analticas
A sintaxe de uma <window_clause>
[ROW or RANGE] BETWEEN <start_expr> AND <end_expr>
<start_expr> pode ser uma das seguintes:
1. UNBOUNDED PECEDING ou
2. CURRENT ROW ou
3. <sql_expr> PRECEDING ou FOLLOWING.
<end_expr> pode ser uma das seguintes:
1. UNBOUNDED FOLLOWING ou
2. CURRENT ROW ou
3. <sql_expr> PRECEDING ou FOLLOWING.
Para janelas do tipo ROW, a definio da faixa em termos de nmero de registros antes ou depois do
registro corrente. Assim, o valor da expresso <sql_expr> tem que ser um inteiro positivo.
Para janelas do tipo RANGE, a definio da faixa em termos de valores antes ou depois da ORDEM
corrente. Vamos explicar com mais clareza em seguida.
ROW ou RANGE no podem aparecer ao mesmo tempo em uma clusula OVER. A clusula de janela
definida em termos do registro corrente, mas esta janela pode ou no incluir o registro corrente. Os
pontos inicial ou final da janela podem terminar antes do registro corrente ou depois do registro corrente.
A nica limitao que o ponto inicial da janela no pode ser maior que o ponto final. Se o incio ou fim
da janela no for explicitamente declarado, eles tomam como valores default UNBOUNDED
PRECEDING para o incio, e UNBOUNDED FOLLOWING para o fim da janela.
Se o ponto final o registro corrente, pode-se utilizar a seguinte sintaxe:
[ROW ou RANGE] [<start_expr> PRECEDING or UNBOUNDED PRECEDING ]
A sintaxe: [ROW or RANGE] CURRENT ROW, tambm permitida, significando que a funo agir
apenas sob o registro corrente.
Janelas do tipo ROW
A sintaxe para funes analticas com janelas do tipo ROW :
Function( ) OVER (PARTITIN BY <expr1> ORDER BY <expr2,..> ROWS BETWEEN <start_expr>
AND <end_expr>)
ou
Function( ) OVER (PARTITON BY <expr1> ORDER BY <expr2,..> ROWS [<start_expr>
10/07/12 SQL - Funes Analticas - Bancoobpedia
11/15 intranet.sicoob.com.br/wiki/index.php/SQL_-_Funes_Analticas
PRECEDING or UNBOUNDED PRECEDING]
Para Janelas do tipo ROW, a clusula de janela em termos do nmero de registros.Na Query-9
exemplos da utilizao da janela do tipo ROW com diversos incios e fins de faixa.
SELECT
YEAR(DATACOMPRA),
COUNT(*) OVER (PARTITION BY YEAR(DATACOMPRA) ORDER BY DATACOMPRA
ROWS BETWEEN 2 PRECEDING AND 1 FOLLOWING) QTD1,
COUNT(*) OVER (PARTITION BY YEAR(DATACOMPRA) ORDER BY DATACOMPRA
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) QTD2,
COUNT(*) OVER (PARTITION BY YEAR(DATACOMPRA) ORDER BY DATACOMPRA
ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) QTD3,
COUNT(*) OVER (PARTITION BY YEAR(DATACOMPRA) ORDER BY DATACOMPRA
ROWS BETWEEN 2 PRECEDING AND 1 PRECEDING) QTD4,
COUNT(*) OVER (PARTITION BY YEAR(DATACOMPRA) ORDER BY DATACOMPRA
ROWS BETWEEN 1 FOLLOWING AND 1 FOLLOWING) QTD5
FROM VEICULO
ORDER BY YEAR(DATACOMPRA)
ANO QTD1 QTD2 QTD3 QTD4 QTD5
2010 2 1 2 0 1
2010 2 2 1 1 0
2011 2 1 4 0 1
2011 3 2 3 1 1
2011 4 3 2 2 1
2011 3 4 1 2 0
2012 2 1 2 0 1
2012 2 2 1 1 0
Query-9 (Janela do tipo ROW)
Janelas do tipo RANGE
A sintaxe para funes analticas com janelas do tipo RANGE :
10/07/12 SQL - Funes Analticas - Bancoobpedia
12/15 intranet.sicoob.com.br/wiki/index.php/SQL_-_Funes_Analticas
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> podemos utilizar UNBOUNDED PECEDING, CURRENT ROW
ou <sql_expr> PRECEDING or FOLLOWING. Entretando, para janelas do tipo RANGE, <sql_expr>
tem que ser compatvel com a clusula ORDER BY expression <expr1>.
<sql_expr> um offset lgico. Tem que ser uma constante ou expresso que resulte em um valor
positivo ou um intervalo. Apenas uma expresso ORDER BY permitida.
Caso <sql_expr> resulte em um valor numrico, ento a expresso em ORDER BY tem que ser do tipo
NUMRICO ou DATA. If <sql_expr> resulte em um intervalo, ento a expresso em ORDER BY
necessita ser do tipo DATA.
No exemplo abaixo (Query-10) utilizado a janela do tipo RANGE. Note que o tamanho da janela em
relao quantidade de registros varia.
--Para cada DATACOMPRA, conte a quantidade de compras que ocorreram entre 60 dias antes e 60
dias depois da DATACOMPRA corrente
SELECT DATACOMPRA,COUNT(*) OVER (ORDER BY DAYS(DATACOMPRA) RANGE
BETWEEN 60 PRECEDING AND 60 FOLLOWING) QTD
FROM VEICULO
ORDER BY DATACOMPRA
DATACOMPRA QTD
10/01/2010 2
10/03/2010 2
10/01/2011 1
10/04/2011 2
10/04/2011 2
10/06/2011 1
10/07/12 SQL - Funes Analticas - Bancoobpedia
13/15 intranet.sicoob.com.br/wiki/index.php/SQL_-_Funes_Analticas
10/02/2012 2
10/03/2012 2
Query-10 (Janela do tipo RANGE)
Exemplos (favor contribuir!)
--Trazer a Soma dos Valores de IPVA por ANO, e TIPO do Veiculo, e acumular esta soma por ANO
SELECT ANO,TIPO,SUM(VALOR),SUM(SUM(VALOR)) OVER (PARTITION BY ANO)
SOMAPORANO
FROM VEICULO V INNER JOIN VEICULO_IPVA VI ON V.PLACA = VI.PLACA
GROUP BY ANO,TIPO
ORDER BY ANO,TIPO
ANO TIPO SOMAANOTIPO SOMAPORANO
2010 CARRO 2110 2110
2011 CAMINHONETE 2000 7975
2011 CARRO 3450 7975
2011 MOTOCICLETA 2525 7975
2012 CAMINHONETE 4300 10885
2012 CARRO 3525 10885
2012 MOTOCICLETA 3060 10885
Concluso
Esta foi uma pequena introduo s funes SQL analticas. Como vimos, elas so extremamente teis e
poderosas. Recomendamos uma boa olhada nos links listados no Anexo 2 para um aprofundamento
sobre o tema.
10/07/12 SQL - Funes Analticas - Bancoobpedia
14/15 intranet.sicoob.com.br/wiki/index.php/SQL_-_Funes_Analticas
Anexo 1 - DDL
drop table VEICULO_IPVA;
drop table VEICULO;
create table VEICULO (
PLACA char(7) NOT NULL,
COR char(20) NOT NULL,
TIPO char(20) NOT NULL,
ANOFABRICACAO char(4) NOT NULL,
DATACOMPRA date NOT NULL,
,CONSTRAINT PK_VEICULO PRIMARY KEY (PLACA));
create table VEICULO_IPVA (
PLACA char(7) NOT NULL,
ANO char(4) NOT NULL,
VALOR decimal NOT NULL,
,CONSTRAINT PK_VEICULO_IPVA PRIMARY KEY (PLACA,ANO),CONSTRAINT
FK_VEICULO_IPVA_VEICULO FOREIGN KEY (PLACA) REFERENCES VEICULO);
insert into VEICULO values ('AAAAAAA','VERMELHO','CARRO' ,'2010','2010-01-10');
insert into VEICULO values ('BBBBBBB','AZUL' ,'CARRO' ,'2010','2010-03-10');
insert into VEICULO values ('CCCCCCC','VERMELHO','MOTOCICLETA','2011','2011-04-10');
insert into VEICULO values ('DDDDDDD','VERDE' ,'MOTOCICLETA','2011','2011-01-10');
insert into VEICULO values ('EEEEEEE','VERMELHO','CARRO' ,'2011','2011-04-10');
insert into VEICULO values ('FFFFFFF','AMARELO' ,'CAMINHONETE','2011','2011-06-10');
insert into VEICULO values ('GGGGGGG','PRETO' ,'MOTOCICLETA' ,'2012','2012-02-10');
insert into VEICULO values ('HHHHHHH','VERDE' ,'CAMINHONETE' ,'2012','2012-03-10');
insert into VEICULO_IPVA values('AAAAAAA','2010',1000);
insert into VEICULO_IPVA values('AAAAAAA','2011',1000);
insert into VEICULO_IPVA values('AAAAAAA','2012',1025);
insert into VEICULO_IPVA values('BBBBBBB','2010',1110);
insert into VEICULO_IPVA values('BBBBBBB','2011',1125);
insert into VEICULO_IPVA values('BBBBBBB','2012',1150);
insert into VEICULO_IPVA values('CCCCCCC','2011',1200);
insert into VEICULO_IPVA values('CCCCCCC','2012',1210);
insert into VEICULO_IPVA values('DDDDDDD','2011',1325);
insert into VEICULO_IPVA values('DDDDDDD','2012',1350);
insert into VEICULO_IPVA values('EEEEEEE','2011',1325);
insert into VEICULO_IPVA values('EEEEEEE','2012',1350);
insert into VEICULO_IPVA values('FFFFFFF','2011',2000);
10/07/12 SQL - Funes Analticas - Bancoobpedia
15/15 intranet.sicoob.com.br/wiki/index.php/SQL_-_Funes_Analticas
insert into VEICULO_IPVA values('FFFFFFF','2012',2100);
insert into VEICULO_IPVA values('GGGGGGG','2012', 500);
insert into VEICULO_IPVA values('HHHHHHH','2012',2200);
commit;
Anexo 2 - Links teis
IBM DB2
http://pic.dhe.ibm.com/infocenter/db2luw/v9r7/index.jsp?
topic=%2Fcom.ibm.db2.luw.sql.ref.doc%2Fdoc%2Fr0023461.html
SQL SERVER 2005
http://msdn.microsoft.com/en-us/library/ms189461(v=sql.90).aspx
SQL SERVER 2008
http://msdn.microsoft.com/en-us/library/ms189461(v=sql.100).aspx
SQL SERVER 2008 R2
http://msdn.microsoft.com/en-us/library/ms189461(v=sql.105).aspx
Analytic functions by Example (artigo principal de referncia para este artigo)
http://www.orafaq.com/node/55
Obtido em "http://intranet.sicoob.com.br/wiki/index.php/SQL_-
_Fun%C3%A7%C3%B5es_Anal%C3%ADticas"
Est pgina foi modificada pela ltima vez s 15h00min de 5 de Julho de 2012.