Especificação OLAP
O On-Line Analytical Processing (OLAP) funções fornece a capacidade de retornar ranking, numeração de linha e informações de função agregada existentes como um valor escalar em um resultado de consulta.
- 1 ARRAY_AGG, CUME_DIST, and PERCENT_RANK are not supported as an aggregate function in aggregation-specification (SQLSTATE 42887).
Uma função OLAP pode ser incluída em expressões em uma select-list ou na cláusula ORDER BY de um select-statement (SQLSTATE 42903). Uma função OLAP não pode ser usada dentro de um argumento para uma expressão XMLQUERY ou XMLEXISTS (SQLSTATE 42903). Uma função OLAP não pode ser usada como um argumento de uma função agregada (SQLSTATE 42607). O resultado da consulta a qual a função OLAP é aplicada é a tabela de resultados da subselect innermost que inclui a função OLAP.
Ao especificar uma função OLAP, é especificada uma janela que define as linhas sobre as quais a função é aplicada, e em que ordem. Quando usadas com uma função agregada, as linhas aplicáveis podem ser ainda mais refinadas, relativas à linha atual, como uma faixa ou várias linhas anteriores e seguindo a linha atual. Por exemplo, dentro de uma partição por mês, uma média pode ser calculada ao longo do período de três meses anteriores.
- O número de linhas precedendo ou peer com a linha atual na janela OLAP, dividido pelo número de linhas na janela OLAP.
O tipo de dado do resultado é o DECFLOAT (34). O resultado não pode ser NULL.
- O RANK da linha atual na janela OLAP menos 1 dividido pelo número de linhas na janela OLAP menos 1.
O tipo de dado do resultado é o DECFLOAT (34). O resultado não pode ser NULL.
A função de classificação computa a classificação ordinal de uma linha dentro da janela. Linhas que não são distintas com relação à ordenação dentro de sua janela são designadas a mesma classificação. Os resultados do ranking podem ser definidos com ou sem lacunas nos números resultantes de valores duplicados.
Se RANK for especificado, a classificação de uma linha é definida como 1 mais o número de linhas que precedem estritamente a linha. Assim, se duas ou mais linhas não forem distintas com relação à ordenação, então haverá uma ou mais lacunas na numeração da classificação sequencial.
Se DENSE_RANK (ou DENSERANK) for especificado, a classificação de uma linha é definida como 1 mais o número de linhas anteriores que são distintas com relação à ordenação. Portanto, não haverá lacunas na numeração de classificação sequencial.
A função ROW_NUMBER (ou ROWNUMBER) computa o número de linha sequencial da linha dentro da janela definida pela ordenação, começando com 1 para a primeira linha. Se a cláusula ORDER BY não for especificada na janela, os números da linha são atribuídos às linhas em ordem arbitrária, conforme devolvido pelo subselect (não de acordo com qualquer cláusula ORDER BY no select-statement).
Se a cláusula fetch for usada junto com a função ROW_NUMBER, os números da linha podem não ser exibidos em ordem. A cláusula fetch-cláusula é aplicada após o conjunto de resultados (incluindo quaisquer designações ROW_NUMBER) ser gerado; portanto, se a ordem de número da linha não for a mesma da ordem do conjunto de resultados, alguns números atribuídos podem estar ausentes na sequência.
O tipo de dados do resultado de RANK, DENSE_RANK ou ROW_NUMBER é BIGINT. O resultado não pode ser nulo.
- num-tiles
- Uma expressão que especifica o número de quantiles. A expressão deve retornar um valor que é um tipo de dados numérico embutido, tipo de dados CHAR ou VARCHAR. Em um banco de dados Unicode, a expressão também pode ser um tipo de dados GRAPHIC ou VARGRAPHIC. CHAR, VARCHAR, GRAPHIC e VARGRAPHIC são suportados por utilizar o casting implícito. Se a expressão não for um SMALLINT, INTEGER ou BIGINT, ele é escalado para BIGINT antes que a função seja avaliada. O valor deve ser maior que 0 (SQLSTATE 22014). A expressão deve ser uma constante, uma variável, ou um molde de uma constante ou variável (SQLSTATE 42601).
O tipo de dado do resultado do NTILE é o mesmo tipo de dados do tipo de dados de num-tiles após qualquer casting implícito. Se o argumento pode ser nulo, o resultado pode ser nulo. Se o argumento for nulo, o resultado será o valor nulo.
A função NTILE computa a classificação de quantil de uma linha dividindo as linhas ordenadas dentro da janela OLAP em num-tiles quantiles e retorna um valor entre 1 e MIN (n, num-tiles), onde n é o número de linhas dentro da janela OLAP. Se n for uniformemente divisível por num-tiles, as linhas na janela OLAP são agrupadas em quantiles num-tiles , cada uma contendo (n / num-tiles) linhas. Caso contrário, cada um dos quantiles 1 através de MOD (n, num-tiles) é atribuído (n / num-tiles + 1) linhas enquanto que cada um dos quantiles (MOD (n, num-tiles) + 1) através de num-tiles é atribuído (n / num-tiles) linhas. O resultado é a classificação quantil que está associada com a linha atual.
As chaves de classificação equivalentes não são consideradas quando as linhas são divididas em quantiles. Linhas com chaves de classificação equivalentes podem ser atribuídas a diferentes quantiles com base na ordem não determinística dessas chaves de classificação. Portanto, o NTILE é uma função não determinística.
A função LAG retorna o valor de expressão para a linha em linhas offset antes da linha atual. O offset deve ser uma constante de número inteiro positivo (SQLSTATE 42815). Um valor offset de 0 significa a linha atual. Se uma janela-partição-cláusula for especificada, offset significa offset linhas antes da linha atual e dentro da partição atual. Se offset não for especificado, o valor 1 será usado. Se default-value (que pode ser uma expressão) for especificado, ele será retornado se o deslocamento for além do escopo da partição atual. Caso contrário, o valor nulo é retornado. Se 'IGNORE NULLS' for especificado, todas as linhas em que o valor de expressão para a linha é o valor nulo não são considerados no cálculo. Se 'IGNORE NULLS' for especificado e todas as linhas forem nulas, default-value (ou o valor null se default-value não foi especificado) é retornado.
A função LEAD retorna o valor de expressão para a linha em linhas offset após a linha atual. O offset deve ser uma constante de número inteiro positivo (SQLSTATE 42815). Um valor offset de 0 significa a linha atual. Se uma janela-partição-cláusula for especificada, offset significa offset linhas após a linha atual e dentro da partição atual. Se offset não for especificado, o valor 1 será usado. Se default-value (que pode ser uma expressão) for especificado, ele será retornado se o deslocamento for além do escopo da partição atual. Caso contrário, o valor nulo é retornado. Se 'IGNORE NULLS' for especificado, todas as linhas em que o valor de expressão para a linha é o valor nulo não são considerados no cálculo. Se 'IGNORE NULLS' for especificado e todas as linhas forem nulas, default-value (ou o valor null se default-value não foi especificado) é retornado.
A função FIRST_VALUE retorna o valor de expressão para a primeira linha em uma janela OLAP. Se 'IGNORE NULLS' for especificado, todas as linhas em que o valor de expressão para a linha é o valor nulo não são considerados no cálculo. Se 'IGNORE NULLS' for especificado e todos os valores na janela OLAP forem nulos, FIRST_VALUE retorna o valor null.
A função LAST_VALUE retorna o valor de expressão para a última linha em uma janela OLAP. Se 'IGNORE NULLS' for especificado, todas as linhas em que o valor de expressão para a linha é o valor nulo não são considerados no cálculo. Se 'IGNORE NULLS' for especificado e todos os valores na janela OLAP forem nulos, LAST_VALUE retorna o valor null.
O tipo de dado do resultado de FIRST_VALUE, LAG, LAST_VALUE e LEAD é o tipo de dados da expressão. O resultado pode ser nulo.
- expressão
- Uma expressão que especifica a linha atual em uma janela OLAP. A expressão deve retornar um valor que é um tipo de dado embutido.(SQLSTATE 42884). nsima linha
- Uma expressão que especifica qual linha da janela OLAP voltar. A expressão deve retornar um valor que é um tipo de dados numérico embutido, um CHAR ou um tipo de dados VARCHAR. Em um banco de dados Unicode, a expressão também pode ser um tipo de dados GRAPHIC ou VARGRAPHIC. CHAR, VARCHAR, GRAPHIC e VARGRAPHIC são suportados usando o casting implícito. Se a expressão não for um SMALLINT, INTEGER ou BIGINT, ele é escalado para BIGINT antes que a função seja avaliada. O valor deve ser maior que 0 (SQLSTATE 22016). A expressão deve ser uma constante, uma variável, ou um molde de uma constante ou variável (SQLSTATE 428I9).
- DE PRIMEIRA ou DE LAST
- Especifica como nth-row é aplicada. Se FROM FIRST for especificado, nth-row é tratado como contar para frente a partir da primeira linha na janela OLAP. Se FROM LAST for especificado, nth-row é tratado como contando para trás a partir da última linha na janela OLAP.
- RESPEITE NULOS ou IGNORE NULLS
- Especifica como valores NULL na janela OLAP são tratados. Se RESPECT NULLS for especificado, todas as linhas em que o valor de expressão para a linha é o valor nulo são considerados no cálculo. Se IGNORE NULLS for especificado, todas as linhas em que o valor de expressão para a linha é o valor nulo não são considerados no cálculo.
O tipo de dado do resultado de NTH_VALUE é o mesmo que o tipo de dados de expression.
O resultado pode ser nulo. Se nth-row for null, o resultado será o valor nulo. Se o número de linhas na janela OLAP (incluindo valores nulos se RESPEITAR NULLS for especificado ou excluir valores nulos se IGNORE NULLS for especificado) for menor do que o valor de nth-row, o resultado será o valor nulo.
A função NTH_VALUE é uma função não determinística porque a cláusula de ordem de janela não é necessária e quando a cláusula de ordem de janela é especificada, as linhas com chaves de classificação equivalentes possuem uma ordem não determinística.
RATIO_TO_REPORT(expression) OVER (...)
CAST(expression AS DECFLOAT(34)) / SUM(expression) OVER(...) A divisão é sempre realizada usando o DECFLOAT (34). O tipo de dados de resultados é o DECFLOAT (34). Se o argumento pode ser nulo, o resultado pode ser nulo; se o argumento for nulo, o resultado será o valor nulo.- PARTIÇÃO POR (particionamento-expressão, ...)
- Define a partição dentro da qual a função é aplicada. Um particionamento-expression é uma expressão que é usada na definição do particionamento do conjunto de resultados. Cada nome-nome que é referenciado em um particionamento-expression deve referenciar inequivocamente uma coluna da tabela de resultados da subselect que contém a especificação OLAP (SQLSTATE 42702 ou 42703). Um particionamento-expression não pode incluir um fullselect escalar ou uma expressão XMLQUERY ou XMLEXISTS (SQLSTATE 42822), ou qualquer função ou consulta que não seja determinística ou que tenha uma ação externa (SQLSTATE 42845).
- janela-ordem-cláusula
- ORDER BY (sort-key-expression, ...)
- Define a ordenação de linhas dentro de uma partição que determina o valor da função OLAP ou o significado dos valores ROW na janela-agregação-group-cláusula (ele não define a ordenação do conjunto de resultados da consulta). expressão-chave-de-classificação
- Uma expressão usada na definição da ordenação das linhas dentro de uma partição de janela. Cada nome de coluna referenciado em um sort-key-expression deve referenciar inequivocamente uma coluna do conjunto de resultados do subselect, incluindo a função OLAP (SQLSTATE 42702 ou 42703). Um sort-key-expression não pode incluir um fullselect escalar ou uma expressão XMLQUERY ou XMLEXISTS (SQLSTATE 42822), ou qualquer função ou query que não seja determinista ou que tenha uma ação externa (SQLSTATE 42845). Essa cláusula é necessária para as funções RANK e DENSE_RANK (SQLSTATE 42601).
- ASC
- Utiliza os valores da expressão de classificação-chave em ordem crescente.
- DECR
- Utiliza os valores da expressão de classificação-chave em ordem decrescente.
- NULLS FIRST
- A ordenação da janela considera valores nulos antes de todos os valores não nulos na ordem de classificação.
- NULLS LAST
- A ordenação da janela considera valores nulos após todos os valores não nulos na ordem de classificação.
- ORDER DE nomeador-designador
- Especifica que a mesma ordenação usada em nome-designador deve ser aplicada na tabela de resultados da subselect. Deve haver uma referência de tabela correspondência nome_designador na cláusula FROM da subselect que especifica esta cláusula (SQLSTATE 42703). A ordenação que é aplicada é a mesma que se as colunas da cláusula ORDER BY na subselect nested (ou fullselect) fossem incluídas na subselect externa (ou fullselect), e estas colunas foram especificadas no lugar da cláusula ORDER OF.
- janela-agregação-grupo-cláusula
- O grupo de agregação de uma linha R é um conjunto de linhas definidas em relação ao R (na ordenação das linhas de partição de R). Esta cláusula especifica o grupo de agregação. Se essa cláusula não for especificada e uma cláusula de ordem de janela também não for especificada, o grupo de agregação consiste em todas as linhas da partição da janela. Este padrão pode ser especificado explicitamente usando RANGE (como mostrado) ou ROWS.
Se janela-order-cláusula for especificada, o comportamento padrão é diferente quando a agregação de janela-group-cláusula não for especificada. O grupo de agregação de janelas consiste em todas as linhas da partição de R que precedem R e que são pares de R na ordenação de janela da partição de janela definida pela cláusula da janela-ordem de janela.
- LINHAS
- Indica o grupo de agregação é definido por linhas de contagem.
- INTERVALO
- Indica o grupo de agregação é definido por um deslocamento a partir de uma chave de classificação.
- grupo-start
- Especifica o ponto de partida para o grupo de agregação. O fim do grupo de agregação é a linha atual. A especificação da cláusula de início de grupo é equivalente a um grupo-entre a cláusula do formulário "BETWEEN group-start E CURRENT ROW".
- grupo-entre
- Especifica o grupo de agregação start e end baseado em ROWS ou RANGE.
- fim do grupo
- Especifica o ponto final para o grupo de agregação. O grupo de agregação start é a linha atual. A especificação da cláusula de fim de grupo é equivalente a um grupo-entre a cláusula do formulário "BETWEEN CURRENT ROW AND group-end".
- UNBOUNDED PRECEDING
- Inclui a partição inteira que precede a linha atual. Isso pode ser especificado com ROWS ou RANGE. Além disso, isso pode ser especificado com várias expressões de classificação-chave na cláusula de ordem de janela.
- UNBOUNDED FOLLOWING
- Inclui a partição inteira seguindo a linha atual. Isso pode ser especificado com ROWS ou RANGE. Além disso, isso pode ser especificado com várias expressões de classificação-chave na cláusula de ordem de janela.
- LINHA ATUAL
- Especifica o início ou término do grupo de agregação com base na linha atual. Se ROWS for especificado, a linha atual é o limite do grupo de agregação. Se RANGE for especificado, o limite do grupo de agregação inclui o conjunto de linhas com os mesmos valores para o sort-key-expressões como a linha atual. Esta cláusula não pode ser especificada em group-bound2 se group-bound1 especificar valor SEGUINDO.
- unsigned-constant PRECEDENTES
- Especifica a faixa ou o número de linhas que antecedem a linha atual. Se ROWS for especificado, então unsigned-constant deve ser zero ou um número inteiro positivo indicando um número de linhas. Se RANGE for especificado, então o tipo de dados de unsigned-constante deve ser comparável ao tipo do sort-key-expression do janela-ordem-cláusula. Só pode haver um sort-key-expression, e o tipo de dados do sort-key-expression deve permitir a subtração. Esta cláusula não pode ser especificada em group-bound2 se group-bound1 for CURRENT ROW ou unsigned-constant SEGUINDO.
- unsigned-constant SEGUIR
- Especifica a faixa ou o número de linhas seguindo a linha atual. Se ROWS for especificado, então unsigned-constant deve ser zero ou um número inteiro positivo indicando um número de linhas. Se RANGE for especificado, então o tipo de dados de unsigned-constante deve ser comparável ao tipo do sort-key-expression do janela-ordem-cláusula. Só pode haver um sort-key-expression, e o tipo de dados do sort-key-expression deve permitir adição.
Exemplos
- Exibir o ranking dos funcionários, em ordem por sobrenome, de acordo com o seu salário total (com base no salário mais bônus) que tenham um salário total superior a $30.000.
SELECT EMPNO, LASTNAME, FIRSTNME, SALARY+BONUS AS TOTAL_SALARY, RANK() OVER (ORDER BY SALARY+BONUS DESC) AS RANK_SALARY FROM EMPLOYEE WHERE SALARY+BONUS > 30000 ORDER BY LASTNAMEObserve que se o resultado deve ser ordenado pelo ranking, então substitua ORDER BY LASTNAME com:
ouORDER BY RANK_SALARYORDER BY RANK() OVER (ORDER BY SALARY+BONUS DESC) - Classificar os departamentos de acordo com o seu salário total médio.
SELECT WORKDEPT, AVG(SALARY+BONUS) AS AVG_TOTAL_SALARY, RANK() OVER (ORDER BY AVG(SALARY+BONUS) DESC) AS RANK_AVG_SAL FROM EMPLOYEE GROUP BY WORKDEPT ORDER BY RANK_AVG_SAL - Classificar os funcionários dentro de um departamento de acordo com o seu nível de educação. Ter vários funcionários com a mesma classificação no departamento não deve aumentar o valor do próximo ranking.
SELECT WORKDEPT, EMPNO, LASTNAME, FIRSTNME, EDLEVEL, DENSE_RANK() OVER (PARTITION BY WORKDEPT ORDER BY EDLEVEL DESC) AS RANK_EDLEVEL FROM EMPLOYEE ORDER BY WORKDEPT, LASTNAME - Forneça números de linhas no resultado de uma consulta.
SELECT ROW_NUMBER() OVER (ORDER BY WORKDEPT, LASTNAME) AS NUMBER, LASTNAME, SALARY FROM EMPLOYEE ORDER BY WORKDEPT, LASTNAME - Liste os cinco melhores trabalhadores assalariados.
Note que uma expressão de tabela aninhada foi usada para primeiramente computar o resultado, incluindo os rankings, antes que a classificação pudesse ser usada na cláusula WHERE. Uma expressão de mesa comum também poderia ter sido usada.SELECT EMPNO, LASTNAME, FIRSTNME, TOTAL_SALARY, RANK_SALARY FROM (SELECT EMPNO, LASTNAME, FIRSTNME, SALARY+BONUS AS TOTAL_SALARY, RANK() OVER (ORDER BY SALARY+BONUS DESC) AS RANK_SALARY FROM EMPLOYEE) AS RANKED_EMPLOYEE WHERE RANK_SALARY < 6 ORDER BY RANK_SALARY - Para cada departamento, liste os salários dos funcionários e mostra quanto menos cada pessoa faz em comparação com o funcionário daquele departamento com o próximo salário mais alto.
SELECT EMPNO, WORKDEPT, LASTNAME, FIRSTNME, JOB, SALARY, LEAD(SALARY, 1) OVER (PARTITION BY WORKDEPT ORDER BY SALARY) - SALARY AS DELTA_SALARY FROM EMPLOYEE ORDER BY WORKDEPT, SALARY - Calcule o salário de um funcionário em relação ao salário do empregado que foi contratado pela primeira vez para o mesmo tipo de emprego.
SELECT JOB, HIREDATE, EMPNO, LASTNAME, FIRSTNME, SALARY, FIRST_VALUE(SALARY) OVER (PARTITION BY JOB ORDER BY HIREDATE) AS FIRST_SALARY, SALARY - FIRST_VALUE(SALARY) OVER (PARTITION BY JOB ORDER BY HIREDATE) AS DELTA_SALARY FROM EMPLOYEE ORDER BY JOB, HIREDATE - Calcule o preço médio de fechamento para o estoque XYZ durante o mês de janeiro de 2006. Se um estoque não comercializam em um determinado dia, seu preço próximo na tabela DAILYSTOCKDATA é o valor nulo. Em vez de devolver o valor nulo por dias que um estoque não comercializam, use a função COALESCE e a função de GAL para devolver o preço próximo para o dia mais recente que o estoque foi negociado. Limite a pesquisa por um valor de fechamento anterior diferente de nulo a um mês antes de 1º de janeiro de 2006.
WITH V1(SYMBOL, TRADINGDATE, CLOSEPRICE) AS ( SELECT SYMBOL, TRADINGDATE, COALESCE(CLOSEPRICE, LAG(CLOSEPRICE, 1, CAST(NULL AS DECIMAL(8,2)), 'IGNORE NULLS') OVER (PARTITION BY SYMBOL ORDER BY TRADINGDATE) ) FROM DAILYSTOCKDATA WHERE SYMBOL = 'XYZ' AND TRADINGDATE BETWEEN '2005-12-01' AND '2006-01-31' ) SELECT SYMBOL, AVG(CLOSEPRICE) AS AVG FROM V1 WHERE TRADINGDATE BETWEEN '2006-01-01' AND '2006-01-31' GROUP BY SYMBOL - Calcule a média móvel de 30 dias para os estoques ABC e XYZ durante o ano de 2005.
WITH V1(SYMBOL, TRADINGDATE, MOVINGAVG30DAY) AS ( SELECT SYMBOL, TRADINGDATE, AVG(CLOSEPRICE) OVER (PARTITION BY SYMBOL ORDER BY TRADINGDATE ROWS BETWEEN 29 PRECEDING AND CURRENT ROW) FROM DAILYSTOCKDATA WHERE SYMBOL IN ('ABC', 'XYZ') AND TRADINGDATE BETWEEN DATE('2005-01-01') - 2 MONTHS AND '2005-12-31' ) SELECT SYMBOL, TRADINGDATE, MOVINGAVG30DAY FROM V1 WHERE TRADINGDATE BETWEEN '2005-01-01' AND '2005-12-31' ORDER BY SYMBOL, TRADINGDATE - Use uma expressão para definir a posição do cursor e consultar uma janela deslizante de 50 linhas antes dessa posição.
SELECT DATE, FIRST_VALUE(CLOSEPRICE + 100) OVER (PARTITION BY SYMBOL ORDER BY DATE ROWS BETWEEN 50 PRECEDING AND 1 PRECEDING) AS FV FROM DAILYSTOCKDATA ORDER BY DATE - Para cada funcionário, calcule o salário médio para o conjunto de funcionários que inclui esses funcionários no mesmo departamento que têm um nível de educação 1 menor e 1 superior ao empregado.
SELECT WORKDEPT, EDLEVEL, SALARY, AVG(SALARY) OVER (PARTITION BY WORKDEPT ORDER BY EDLEVEL RANGE BETWEEN 1 PRECEDING AND 1 FOLLOWING) FROM EMPLOYEE ORDER BY WORKDEPT, EDLEVEL - Calcule qual quartil (4-quantiles) o salário de cada funcionário está em.
O conjunto de resultados é:SELECT EMPNO, SALARY, NTILE(4) OVER (ORDER BY SALARY) AS QUARTILE FROM EMPLOYEE ORDER BY SALARYEMPNO SALARY QUARTILE ------ ----------- ----------- 200340 31840.00 1 000290 35340.00 1 200330 35370.00 1 000310 35900.00 1 200310 35900.00 1 000280 36250.00 1 000270 37380.00 1 000300 37750.00 1 200240 37760.00 1 200120 39250.00 1 000320 39950.00 1 000230 42180.00 2 000340 43840.00 2 000170 44680.00 2 000330 45370.00 2 200280 46250.00 2 200010 46500.00 2 000260 47250.00 2 000240 48760.00 2 000250 49180.00 2 000120 49250.00 2 000220 49840.00 2 000190 50450.00 3 000180 51340.00 3 000150 55280.00 3 000200 57740.00 3 000160 62250.00 3 200170 64680.00 3 000110 66500.00 3 000210 68270.00 3 000140 68420.00 3 200140 68420.00 3 200220 69840.00 4 000060 72250.00 4 000130 73800.00 4 000050 80175.00 4 000100 86150.00 4 000090 89750.00 4 000020 94250.00 4 000070 96170.00 4 000030 98250.00 4 000010 152750.00 4 42 record(s) selected. - A consulta no exemplo a seguir divide as linhas em 3 baldes, agrupando-as por salário máximo. O salário máximo é incluído para mostrar quais valores entram em cada balde:
Uma parte da saída da consulta está na tabela a seguir:SELECT NTILE(3) OVER (ORDER BY MAX_SALARY) AS Bucket, MAX_SALARY FROM GOSALESDW.EMP_POSITION_DIM;Tabela 1. exemplo de saída Depósito MAX_SALARY 1 0.00 ... ... 1 35000.00 2 5000.00 ... ... 2 12000.00 3 13000.00 ... ... 3 301500.00 - Encontre a distribuição cumulativa e o grau de percentil relativo de cada salário de cada funcionário dentro de seu departamento.
O conjunto de resultados é:SELECT EMPNO, WORKDEPT, SALARY, CAST(CUME_DIST() OVER (PARTITION BY WORKDEPT ORDER BY SALARY) AS DECIMAL(4,3)) AS CUME_DIST, CAST(PERCENT_RANK() OVER (PARTITION BY WORKDEPT ORDER BY SALARY) AS DECIMAL(4,3)) AS PERCENT_RANK FROM EMP ORDER BY WORKDEPT, SALARYEMPNO WORKDEPT SALARY CUME_DIST PERCENT_RANK ------ -------- ----------- --------- ------------ 200120 A00 39250.00 0.200 0.000 200010 A00 46500.00 0.400 0.250 000120 A00 49250.00 0.600 0.500 000110 A00 66500.00 0.800 0.750 000010 A00 152750.00 1.000 1.000 000020 B01 94250.00 1.000 0.000 000140 C01 68420.00 0.500 0.000 200140 C01 68420.00 0.500 0.000 000130 C01 73800.00 0.750 0.666 000030 C01 98250.00 1.000 1.000 000170 D11 44680.00 0.090 0.000 000220 D11 49840.00 0.181 0.100 000190 D11 50450.00 0.272 0.200 000180 D11 51340.00 0.363 0.300 000150 D11 55280.00 0.454 0.400 000200 D11 57740.00 0.545 0.500 000160 D11 62250.00 0.636 0.600 200170 D11 64680.00 0.727 0.700 000210 D11 68270.00 0.818 0.800 200220 D11 69840.00 0.909 0.900 000060 D11 72250.00 1.000 1.000 000270 D21 37380.00 0.142 0.000 200240 D21 37760.00 0.285 0.166 000230 D21 42180.00 0.428 0.333 000260 D21 47250.00 0.571 0.500 000240 D21 48760.00 0.714 0.666 000250 D21 49180.00 0.857 0.833 000070 D21 96170.00 1.000 1.000 000050 E01 80175.00 1.000 0.000 000290 E11 35340.00 0.142 0.000 000310 E11 35900.00 0.428 0.166 200310 E11 35900.00 0.428 0.166 000280 E11 36250.00 0.571 0.500 000300 E11 37750.00 0.714 0.666 200280 E11 46250.00 0.857 0.833 000090 E11 89750.00 1.000 1.000 200340 E21 31840.00 0.166 0.000 200330 E21 35370.00 0.333 0.200 000320 E21 39950.00 0.500 0.400 000340 E21 43840.00 0.666 0.600 000330 E21 45370.00 0.833 0.800 000100 E21 86150.00 1.000 1.000 42 record(s) selected. - Compare o salário de cada funcionário com o salário mais alto e o segundo salário mais alto do departamento.
O conjunto de resultados é:SELECT WORKDEPT, SALARY, FIRST_VALUE(SALARY) OVER (PARTITION BY WORKDEPT ORDER BY SALARY DESC) AS FIRST, NTH_VALUE(SALARY, 2) OVER (PARTITION BY WORKDEPT ORDER BY SALARY DESC) AS SECOND FROM EMP ORDER BY WORKDEPT, SALARYWORKDEPT SALARY FIRST SECOND -------- ----------- ----------- -------- A00 39250.00 152750.00 66500.00 A00 46500.00 152750.00 66500.00 A00 49250.00 152750.00 66500.00 A00 66500.00 152750.00 66500.00 A00 152750.00 152750.00 66500.00 B01 94250.00 94250.00 - C01 68420.00 98250.00 73800.00 C01 68420.00 98250.00 73800.00 C01 73800.00 98250.00 73800.00 C01 98250.00 98250.00 73800.00 D11 44680.00 72250.00 69840.00 D11 49840.00 72250.00 69840.00 D11 50450.00 72250.00 69840.00 D11 51340.00 72250.00 69840.00 D11 55280.00 72250.00 69840.00 D11 57740.00 72250.00 69840.00 D11 62250.00 72250.00 69840.00 D11 64680.00 72250.00 69840.00 D11 68270.00 72250.00 69840.00 D11 69840.00 72250.00 69840.00 D11 72250.00 72250.00 69840.00 D21 37380.00 96170.00 49180.00 D21 37760.00 96170.00 49180.00 D21 42180.00 96170.00 49180.00 D21 47250.00 96170.00 49180.00 D21 48760.00 96170.00 49180.00 D21 49180.00 96170.00 49180.00 D21 96170.00 96170.00 49180.00 E01 80175.00 80175.00 - E11 35340.00 89750.00 46250.00 E11 35900.00 89750.00 46250.00 E11 35900.00 89750.00 46250.00 E11 36250.00 89750.00 46250.00 E11 37750.00 89750.00 46250.00 E11 46250.00 89750.00 46250.00 E11 89750.00 89750.00 46250.00 E21 31840.00 86150.00 45370.00 E21 35370.00 86150.00 45370.00 E21 39950.00 86150.00 45370.00 E21 43840.00 86150.00 45370.00 E21 45370.00 86150.00 45370.00 E21 86150.00 86150.00 45370.00 42 record(s) selected.
