A volte potrebbe essere necessario classificare su partizione in MySQL o classificare raggruppati in MySQL. Vedremo come classificare sulla partizione usando la funzione di classificazione di MySQL. È possibile utilizzare questo approccio per classificare separatamente all'interno di ciascun gruppo/partizione in una tabella. Tuttavia, tieni presente che questa funzione è disponibile solo da MySQL 8.0.
Classifica MySQL su partizione
Useremo la funzione MySQL RANK() per classificare all'interno del gruppo. Ecco la sintassi della funzione MySQL RANK.
RANK() OVER ( PARTITION BY <expression>[{,<expression>...}] ORDER BY <expression> [ASC|DESC], [{,<expression>...}] )
La funzione di classificazione assegna un grado a ciascuna riga all'interno di una partizione in modo tale che il grado di ogni riga sia uno in più rispetto al numero totale di righe che sono state classificate in quella partizione.
Nella sintassi precedente, la clausola PARTITION BY dividerà le righe in partizioni. È possibile partizionare una tabella in base a uno o più valori di colonna. Se non vuoi partizionare la tabella, puoi semplicemente omettere del tutto la clausola PARTITION BY.
Bonus Leggi:Come modificare il fuso orario di MySQL nella query
La funzione Rank calcolerà il rango all'interno di ogni partizione/gruppo e reinizializzerà il numero del rango quando si inizia con una nuova partizione.
La clausola ORDER BY ordina le righe all'interno di ciascuna partizione in base ai valori in una o più colonne.
Bonus Lettura:MySQL Confronta i database
Diciamo che hai la seguente tabella.
mysql> create table for_rank(id int, month varchar(10),amount int); mysql> insert into for_rank(id, month, amount) values(1,'Jan',450), (2,'Jan',350), (3,'Jan',250), (4,'Feb',150), (5,'Feb',450), (6,'Feb',500), (7,'Mar',350), (8,'Mar',450), (9,'Mar',250), (10,'Mar',150); mysql> select * from for_rank; +------+-------+--------+ | id | month | amount | +------+-------+--------+ | 1 | Jan | 450 | | 2 | Jan | 350 | | 3 | Jan | 250 | | 4 | Feb | 150 | | 5 | Feb | 450 | | 6 | Feb | 500 | | 7 | Mar | 350 | | 8 | Mar | 450 | | 9 | Mar | 250 | | 10 | Mar | 150 | +------+-------+--------+
Bonus Lettura:MySQL mostra gli indici nei database
Ecco la query per assegnare un rango a ciascuna riga della tabella, senza utilizzare alcuna clausola PARTITION BY.
SELECT id, month, amount, RANK() OVER ( PARTITION BY Month ORDER BY amount desc ) my_rank FROM for_rank; +------+-------+--------+--------+ | id | month | amount | rank | +------+-------+--------+--------+ | 6 | Feb | 500 | 1 | | 5 | Feb | 450 | 2 | | 4 | Feb | 150 | 3 | | 1 | Jan | 450 | 1 | | 2 | Jan | 350 | 2 | | 3 | Jan | 250 | 3 | | 8 | Mar | 450 | 1 | | 7 | Mar | 350 | 2 | | 9 | Mar | 250 | 3 | | 10 | Mar | 150 | 4 | +------+-------+--------+--------+
Nella query precedente, partizioniamo la tabella in base al nome del mese, quindi classifichiamo ogni riga all'interno di ciascuna partizione in ordine decrescente di importo.
Si spera che ora tu possa usare facilmente la funzione MySQL Rank per classificare su partizioni e gruppi.
Ubiq semplifica la visualizzazione dei dati in pochi minuti e il monitoraggio in dashboard in tempo reale. Provalo oggi!