Resumo : neste tutorial, você aprenderá como usar a NTILE()
função MySQL para dividir linhas em um número especificado de grupos.
Introdução à função MySQL NTILE()
A NTILE()
função MySQL divide as linhas em uma partição classificada em um número específico de grupos. Cada grupo recebe um número de bucket começando em um. Para cada linha, a NTILE()
função retorna um número de intervalo que representa o grupo ao qual a linha pertence.
O seguinte mostra a sintaxe da NTILE()
função:
NTILE(n) OVER (
PARTITION BY <expression>[{,<expression>...}]
ORDER BY <expression> [ASC|DESC], [{,<expression>...}]
)
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Nesta sintaxe:
-
n
é um número inteiro positivo literal. O número do bucket está no intervalo de 1 an
. - Divide
PARTITION BY
o conjunto de resultados retornado daFROM
cláusula em partições às quais aNTILE()
função é aplicada. - A
ORDER BY
cláusula especifica a ordem em que osNTILE()
valores são atribuídos às linhas em uma partição.
Observe que se o número de linhas da partição não for divisível por n
, a NTILE()
função resultará em grupos de dois tamanhos com diferença de um. Os grupos maiores sempre vêm antes do grupo menor na ordem especificada pela ORDER BY
cláusula.
Por outro lado, se o total de linhas da partição for divisível por n
, as linhas serão divididas igualmente entre os grupos.
Veja a tabela a seguir que armazena nove inteiros de um a nove:
CREATE TABLE t (
val INT NOT NULL
);
INSERT INTO t(val)
VALUES(1),(2),(3),(4),(5),(6),(7),(8),(9);
SELECT * FROM t;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Se você usar a NTILE()
função para dividir nove linhas em quatro grupos, terminará no primeiro grupo com três linhas e nos outros três grupos com quatro linhas.
Veja a seguinte demonstração:
SELECT
val,
NTILE (4) OVER (
ORDER BY val
) bucket_no
FROM
t;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Aqui está a saída:
Como você pode ver na saída, o primeiro grupo possui três linhas, enquanto os outros grupos possuem duas linhas.
Vamos alterar o número de grupos de quatro para três conforme mostrado na consulta a seguir:
SELECT
val,
NTILE (3) OVER (
ORDER BY val
) bucket_no
FROM
t;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
O conjunto de resultados agora possui três grupos com o mesmo número de linhas.
Exemplo de função MySQL NTILE()
Usaremos as tabelas orders
, orderDetails
e products
do banco de dados de exemplo para a demonstração.
Veja a seguinte consulta:
WITH productline_sales AS (
SELECT productline,
year(orderDate) order_year,
ROUND(SUM(quantityOrdered * priceEach),0) order_value
FROM orders
INNER JOIN orderdetails USING (orderNumber)
INNER JOIN products USING (productCode)
GROUP BY productline, order_year
)
SELECT
productline,
order_year,
order_value,
NTILE(3) OVER (
PARTITION BY order_year
ORDER BY order_value DESC
) product_line_group
FROM
productline_sales;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Neste exemplo:
- Primeiro, na
productline_sales
expressão da tabela comum, obtemos o valor total do pedido de cada linha de produto por ano. - Em seguida, utilizamos a
NTILE()
função para dividir as vendas por linha de produto de cada ano em três grupos.
Aqui está a saída:
Resumo
- Use a
NTILE()
função MySQL para distribuir linhas em um número especificado de grupos.