- Categorias:
Funções de janela (Relacionada à classificação, Quadro de janela)
NTH_VALUE¶
Retorna o enésimo valor (até 1000) dentro de um grupo ordenado de valores.
- Consulte também:
Sintaxe¶
NTH_VALUE( <expr> , <n> ) [ FROM { FIRST | LAST } ] [ { IGNORE | RESPECT } NULLS ]
OVER ( [ PARTITION BY <expr1> ] ORDER BY <expr2> [ { ASC | DESC } ] [ <window_frame> ] )
Para obter mais detalhes sobre a sintaxe window_frame
, consulte Sintaxe e utilização do quadro de janela.
Argumentos¶
n
Isto especifica qual valor de N a ser usado quando se procura o valor N.
expr
A expressão que determina o valor de retorno.
expr1
A expressão pela qual as linhas são particionadas. Você pode especificar uma única expressão ou uma lista de expressões separadas por vírgula. Por exemplo:
PARTITION BY column_1, column_2
expr2
A expressão pela qual se ordenam as linhas. Você pode especificar uma única expressão ou uma lista de expressões separadas por vírgula. Por exemplo:
ORDER BY column_3, column_4
Notas de uso¶
O valor de entrada
n
não pode ser maior que 1000.Se
FROM { FIRST | LAST }
não for especificado, o padrão éFIRST
(ou seja, a direção é do início da lista ordenada).Se
{ IGNORE | RESPECT } NULLS
não for especificado, o padrão seráRESPECT NULLS
(ou seja, um valor NULL é retornado se a expressão contiver um valor NULL e for o enésimo valor na expressão).
Esta função é uma função relacionada à classificação, portanto, deve especificar uma janela. Uma cláusula de janela consiste nas seguintes subcláusulas:
Subcláusula
PARTITION BY <expr1>
(opcional).Subcláusula
ORDER BY <expr2>
(obrigatória). Para obter mais detalhes sobre opções adicionais de classificação suportadas (ordem de classificação, ordenação de valores NULL etc.), consulte a documentação para a construção da consulta ORDER BY, que segue as mesmas regras.Subcláusula
window_frame
(opcional).
A ordem das linhas em uma janela (e portanto o resultado da consulta) é totalmente determinística somente se as chaves na cláusula ORDER BY tornarem cada linha única. Considere o seguinte exemplo:
... OVER (PARTITION BY p ORDER BY o COLLATE 'lower') ...
O resultado da consulta pode variar se qualquer partição contiver valores da coluna
o
que sejam idênticos, ou seriam idênticos em uma comparação que não diferencia maiúsculas e minúsculas.A cláusula ORDER BY dentro da cláusula OVER controla a ordem das linhas somente dentro da janela, não a ordem das linhas na saída de toda a consulta. Para controlar a ordem de saída, use uma cláusula ORDER BY separada no nível mais externo da consulta.
O
window_frame
opcional (cumulativo ou deslizante) especifica o subconjunto de linhas dentro do intervalo para o qual a função é calculada. Se nenhumwindow_frame
for especificado, o padrão é a janela inteira:ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
Observe que isso se desvia da norma ANSI, que especifica o seguinte padrão para quadros de janelas:
RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
Para obter mais detalhes sobre quadros de janela, incluindo sintaxe e exemplos, consulte Sintaxe e utilização do quadro de janela.
Exemplos¶
SELECT
column1,
column2,
NTH_VALUE(column2, 2) OVER (PARTITION BY column1 ORDER BY column2) AS column2_2nd
FROM VALUES
(1, 10), (1, 11), (1, 12),
(2, 20), (2, 21), (2, 22);
+---------+---------+-------------+
| COLUMN1 | COLUMN2 | COLUMN2_2ND |
|---------+---------+-------------|
| 1 | 10 | 11 |
| 1 | 11 | 11 |
| 1 | 12 | 11 |
| 2 | 20 | 21 |
| 2 | 21 | 21 |
| 2 | 22 | 21 |
+---------+---------+-------------+
A próxima consulta compara as saídas de FIRST_VALUE
, NTH_VALUE
e LAST_VALUE
. Note que:
A consulta cria um quadro de janela deslizante que tem 3 linhas de largura, que contém:
A linha que precede a linha atual.
A linha atual.
A linha que segue a linha atual.
A
2
na chamadaNTH_VALUE(i, 2)
especifica a segunda linha no quadro da janela (que, neste caso, é também a linha atual).Quando a linha atual é a primeira linha no quadro da janela, não há linha anterior para referência, portanto
FIRST_VALUE()
retorna um NULL para aquela linha.
SELECT
partition_col, order_col, i,
FIRST_VALUE(i) OVER (PARTITION BY partition_col ORDER BY order_col
ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS FIRST_VAL,
NTH_VALUE(i, 2) OVER (PARTITION BY partition_col ORDER BY order_col
ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS NTH_VAL,
LAST_VALUE(i) OVER (PARTITION BY partition_col ORDER BY order_col
ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS LAST_VAL
FROM demo1
ORDER BY partition_col, i, order_col;
+---------------+-----------+---+-----------+---------+----------+
| PARTITION_COL | ORDER_COL | I | FIRST_VAL | NTH_VAL | LAST_VAL |
|---------------+-----------+---+-----------+---------+----------|
| 1 | 1 | 1 | NULL | 1 | 2 |
| 1 | 2 | 2 | 1 | 2 | 3 |
| 1 | 3 | 3 | 2 | 3 | 4 |
| 1 | 4 | 4 | 3 | 4 | 5 |
| 1 | 5 | 5 | 4 | 5 | 5 |
| 2 | 1 | 1 | NULL | 1 | 2 |
| 2 | 2 | 2 | 1 | 2 | 3 |
| 2 | 3 | 3 | 2 | 3 | 4 |
| 2 | 4 | 4 | 3 | 4 | 4 |
+---------------+-----------+---+-----------+---------+----------+