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 BY
cláusula divide os conjuntos de resultados produzidos pelaFROM
cláusula em partições. ADENSE_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 aDENSE_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 t
com 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 sales
tabela 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:
Neste exemplo:
- Primeiro, a
PARTITION BY
cláusula dividiu os conjuntos de resultados em partições utilizando o ano fiscal. - Em segundo lugar, a
ORDER BY
clá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 pelaORDER BY
cláusula.
Resumo
- Use a função MySQL
DENSE_RANK()
para classificar linhas em cada partição de um conjunto de resultados.