Função MySQL NTILE

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 a n.
  • Divide PARTITION BYo conjunto de resultados retornado da FROMcláusula em partições às quais a NTILE()função é aplicada.
  • A ORDER BYcláusula especifica a ordem em que os NTILE()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 BYclá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:

Função MySQL NTILE - grupos com diferentes números de linhas

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.

Função MySQL NTILE - grupos com diferença em linhas

Exemplo de função MySQL NTILE()

Usaremos as tabelas orders, orderDetails e productsdo 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_salesexpressã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:

Função MySQL NTILE com exemplo CTE

Resumo

  • Use a NTILE()função MySQL para distribuir linhas em um número especificado de grupos.

Deixe um comentário

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