Categorias:

Funções de janela (relacionada à classificação)

ROW_NUMBER

Retorna um número de linha único para cada linha dentro de uma partição de janela.

O número da linha começa em 1 e continua em sequência.

Sintaxe

ROW_NUMBER() OVER (
  [ PARTITION BY <expr1> [, <expr2> ... ] ]
  ORDER BY <expr3> [ , <expr4> ... ] [ { ASC | DESC } ]
  )
Copy

Argumentos

Nenhum.

Notas de uso

  • expr1 e expr2 especificam a(s) coluna(s) ou expressão(ões) a ser(em) dividida(s). Você pode dividir por 0, 1 ou mais expressões.

    Por exemplo, suponha que você esteja selecionando dados entre vários estados (ou províncias) e queira números de linha de 1 a N dentro de cada estado; nesse caso, você pode dividir pelo estado.

    Se você quiser apenas um único grupo, então omita a cláusula PARTITION BY.

  • expr3 e expr4 especificam a(s) coluna(s) ou expressão(ões) usadas para determinar a ordem das linhas. Você pode ordenar por 1 ou mais expressões.

    Por exemplo, se quiser listar os agricultores ordenados pela produção de milho, então use a coluna bushels_produced. Para obter mais detalhes, consulte Exemplos (neste tópico).

Exemplos

Mostre os agricultores em ordem decrescente por quantidade de milho produzido, e atribua números de linha nessa ordem (o agricultor que produzir mais milho terá o número de linha 1).

SELECT state, bushels_produced, ROW_NUMBER()
  OVER (ORDER BY bushels_produced DESC)
  FROM corn_production;

+--------+------------------+------------+
|  state | bushels_produced | ROW_NUMBER |
+--------+------------------+------------+
| Kansas |              130 |           1|
| Kansas |              120 |           2|
| Iowa   |              110 |           3|
| Iowa   |              100 |           4|
+--------+------------------+------------+
Copy

A consulta abaixo mostra como atribuir números de linha dentro das partições. Neste caso, as partições são as bolsas de valores (por exemplo “N” para “NASDAQ”).

SELECT
  symbol,
  exchange,
  shares,
  ROW_NUMBER() OVER (PARTITION BY exchange ORDER BY shares) AS row_number
FROM trades;

+------+--------+------+----------+
|SYMBOL|EXCHANGE|SHARES|ROW_NUMBER|
+------+--------+------+----------+
|SPY   |C       |   250|         1|
|AAPL  |C       |   250|         2|
|AAPL  |C       |   300|         3|
|SPY   |N       |   100|         1|
|AAPL  |N       |   300|         2|
|SPY   |N       |   500|         3|
|QQQ   |N       |   800|         4|
|QQQ   |N       |  2000|         5|
|YHOO  |N       |  5000|         6|
+------+--------+------+----------+
Copy