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.

OLAP-specification
Read syntax diagramSkip visual syntax diagramordered-OLAP-specificationnumbering-specificationaggregation-specification
ordered-OLAP-specification
Read syntax diagramSkip visual syntax diagramCUME_DIST ()PERCENT_RANK ()RANK ()DENSE_RANK ()NTILE( num-tiles)lag-functionlead-functionOVER( window-partition-clause window-order-clause)
lag-function
Read syntax diagramSkip visual syntax diagramLAG(expression ,offset,default-value,'RESPECT NULLS','IGNORE NULLS' )
lead-function
Read syntax diagramSkip visual syntax diagramLEAD(expression ,offset,default-value,'RESPECT NULLS','IGNORE NULLS' )
window-partition-clause
Read syntax diagramSkip visual syntax diagramPARTITION BY ,partitioning-expression
window-order-clause
Read syntax diagramSkip visual syntax diagramORDER BY,sort-key-expressionasc-optiondesc-optionORDER OFtable-designator
asc-option
Read syntax diagramSkip visual syntax diagramASC NULLS LASTNULLS FIRST
desc-option
Read syntax diagramSkip visual syntax diagramDESC NULLS FIRSTNULLS LAST
numbering-specification
Read syntax diagramSkip visual syntax diagramROW_NUMBER ()OVER( window-partition-clause window-order-clause )
aggregation-specification
Read syntax diagramSkip visual syntax diagram aggregate-function1OLAP-aggregate-function OVER(window-partition-clause RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWINGwindow-order-clauseRANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROWwindow-aggregation-group-clause)
OLAP-aggregate-function
Read syntax diagramSkip visual syntax diagram first-value-functionlast-value-functionnth-value-functionratio-to-report-function
first-value-function
Read syntax diagramSkip visual syntax diagram FIRST_VALUE ( expression ,'RESPECT NULLS','IGNORE NULLS' )
last-value-function
Read syntax diagramSkip visual syntax diagram LAST_VALUE ( expression ,'RESPECT NULLS','IGNORE NULLS' )
nth-value-function
Read syntax diagramSkip visual syntax diagram NTH_VALUE ( expression , nth-row ) RESPECT NULLSIGNORE NULLS FROM FIRSTFROM LAST
ratio-to-report-function
Read syntax diagramSkip visual syntax diagramRATIO_TO_REPORT(expression )
window-aggregation-group-clause
Read syntax diagramSkip visual syntax diagramROWSRANGEgroup-startgroup-betweengroup-end
group-start
Read syntax diagramSkip visual syntax diagramUNBOUNDED PRECEDINGunsigned-constantPRECEDINGCURRENT ROW
group-between
Read syntax diagramSkip visual syntax diagramBETWEENgroup-bound1AND group-bound2
group-bound1
Read syntax diagramSkip visual syntax diagramUNBOUNDED PRECEDINGunsigned-constantPRECEDINGunsigned-constantFOLLOWINGCURRENT ROW
group-bound2
Read syntax diagramSkip visual syntax diagramUNBOUNDED FOLLOWINGunsigned-constantPRECEDINGunsigned-constantFOLLOWINGCURRENT ROW
group-end
Read syntax diagramSkip visual syntax diagramUNBOUNDED FOLLOWINGunsigned-constantFOLLOWING
Notes:
  • 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.

A função CUME_DIST é uma função de distribuição que retorna uma distribuição acumulativa de uma linha em uma janela OLAP, expressa como um valor entre 0.0 - 1.0. O resultado é computado da seguinte forma:
  • 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.

A função PERCENT_RANK é uma função de distribuição que retorna uma classificação de percentil relativa de uma linha em uma janela OLAP, expressa como um valor entre 0.0 - 1.0. Quando o número de linhas na janela OLAP for maior que 1, o resultado é computado da seguinte forma:
  • O RANK da linha atual na janela OLAP menos 1 dividido pelo número de linhas na janela OLAP menos 1.
Caso contrário, o resultado será 0.0..

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.

A função NTILE retorna a classificação quantil de uma linha.
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.

A função NTH_VALUE retorna o valor de expressão para a linha nth-row em uma janela OLAP.
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.

A função RATIO_TO_REPORT retorna a proporção de um argumento para a soma dos argumentos em uma partição OLAP. Por exemplo, as funções a seguir são equivalentes:
   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

  1. 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 LASTNAME
    Observe que se o resultado deve ser ordenado pelo ranking, então substitua ORDER BY LASTNAME com:
       ORDER BY RANK_SALARY
    ou
       ORDER BY RANK() OVER (ORDER BY SALARY+BONUS DESC)
  2. 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
  3. 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
  4. 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
  5. Liste os cinco melhores trabalhadores assalariados.
       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
    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.
  6. 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
    
  7. 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
  8. 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
    
  9. 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
  10. 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
  11. 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
  12. Calcule qual quartil (4-quantiles) o salário de cada funcionário está em.
       SELECT EMPNO, SALARY, NTILE(4) OVER 
             (ORDER BY SALARY) AS QUARTILE
          FROM EMPLOYEE 
          ORDER BY SALARY
    O conjunto de resultados é:
    EMPNO  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.   
  13. 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:
       SELECT NTILE(3) OVER (ORDER BY MAX_SALARY) AS Bucket, 
    MAX_SALARY FROM GOSALESDW.EMP_POSITION_DIM;
    Uma parte da saída da consulta está na tabela a seguir:
    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
  14. Encontre a distribuição cumulativa e o grau de percentil relativo de cada salário de cada funcionário dentro de seu departamento.
       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, SALARY
    O conjunto de resultados é:
    EMPNO  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.
  15. Compare o salário de cada funcionário com o salário mais alto e o segundo salário mais alto do departamento.
          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, SALARY
    O conjunto de resultados é:
    WORKDEPT 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.