Função MySQL DENSE_RANK

Resumo : neste tutorial, você aprenderá sobre a DENSE_RANK()função MySQL e como aplicá-la para encontrar a classificação de linhas em uma partição ou conjunto de resultados.

Introdução à função MySQL DENSE_RANK

É DENSE_RANK()uma função de janela que atribui uma classificação a cada linha em uma partição ou conjunto de resultados sem lacunas nos valores de classificação.

A classificação de uma linha é aumentada em um a partir do número de valores de classificação distintos que vêm antes da linha.

Aqui está a sintaxe básica da DENSE_RANK() função:

DENSE_RANK() OVER (
    PARTITION BY partition_expression
    ORDER BY sort_expression [ASC|DESC]
)Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Nesta sintaxe:

  • Primeiro, a PARTITION BYcláusula divide os conjuntos de resultados produzidos pela FROMcláusula em partições. A DENSE_RANK()função é aplicada a cada partição de forma independente.
  • Segundo, a ORDER BY  cláusula especifica a ordem das linhas em cada partição na qual a DENSE_RANK()função opera.

Se uma partição tiver duas ou mais linhas com o mesmo valor de classificação, cada uma dessas linhas receberá a mesma classificação.

Ao contrário da RANK()função, a DENSE_RANK()função sempre retorna valores de classificação consecutivos.

Suponha que você tenha uma tabela tcom alguns dados de amostra como segue:

CREATE TABLE t (
    val INT
);

INSERT INTO t(val)
VALUES(1),(2),(2),(3),(4),(4),(5);


SELECT * FROM t;Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Saída:

+------+
| val  |
+------+
|    1 |
|    2 |
|    2 |
|    3 |
|    4 |
|    4 |
|    5 |
+------+
7 rows in set (0.00 sec)Linguagem de código:  JavaScript  ( javascript )

A instrução a seguir usa a DENSE_RANK()função para atribuir uma classificação a cada linha:

SELECT
    val,
    DENSE_RANK() OVER (
        ORDER BY val
    ) my_rank
FROM t;Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Aqui está a saída:

+------+---------+
| val  | my_rank |
+------+---------+
|    1 |       1 |
|    2 |       2 |
|    2 |       2 |
|    3 |       3 |
|    4 |       4 |
|    4 |       4 |
|    5 |       5 |
+------+---------+
7 rows in set (0.01 sec)Linguagem de código:  JavaScript  ( javascript )

Exemplo de função DENSE_RANK() do MySQL

Usaremos a seguinte salestabela para demonstração:

CREATE TABLE sales(
    sales_employee VARCHAR(50) NOT NULL,
    fiscal_year INT NOT NULL,
    sale DECIMAL(14,2) NOT NULL,
    PRIMARY KEY(sales_employee,fiscal_year)
);

INSERT INTO sales(sales_employee,fiscal_year,sale)
VALUES('Bob',2016,100),
      ('Bob',2017,150),
      ('Bob',2018,200),
      ('Alice',2016,150),
      ('Alice',2017,100),
      ('Alice',2018,200),
       ('John',2016,200),
      ('John',2017,150),
      ('John',2018,250);

SELECT * FROM sales;Linguagem de código:  PHP  ( php )

Saída:

+----------------+-------------+--------+
| sales_employee | fiscal_year | sale   |
+----------------+-------------+--------+
| Alice          |        2016 | 150.00 |
| Alice          |        2017 | 100.00 |
| Alice          |        2018 | 200.00 |
| Bob            |        2016 | 100.00 |
| Bob            |        2017 | 150.00 |
| Bob            |        2018 | 200.00 |
| John           |        2016 | 200.00 |
| John           |        2017 | 150.00 |
| John           |        2018 | 250.00 |
+----------------+-------------+--------+
9 rows in set (0.00 sec)Linguagem de código:  JavaScript  ( javascript )

A instrução a seguir usa a DENSE_RANK()função para classificar os vendedores por valor de venda.

SELECT 
  sales_employee, 
  fiscal_year, 
  sale, 
  DENSE_RANK() OVER (
    PARTITION BY fiscal_year 
    ORDER BY sale DESC
  ) sales_rank 
FROM 
  sales;Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

A saída é a seguinte:

MySQL DENSE_RANK - Atribuir classificação aos funcionários de vendas

Neste exemplo:

  • Primeiro, a PARTITION BYcláusula dividiu os conjuntos de resultados em partições utilizando o ano fiscal.
  • Em segundo lugar, a ORDER BYcláusula especificava a ordem dos vendedores por vendas em ordem decrescente.
  • Terceiro, a DENSE_RANK()função é aplicada a cada partição com a ordem das linhas especificada pela ORDER BYcláusula.

Resumo

  • Use a função MySQL DENSE_RANK()para classificar linhas em cada partição de um conjunto de resultados.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *