Equivalente MySQL di ORACLES rank ()

Oracle ha 2 funzioni – rank () e dense_rank () – che ho trovato molto utile per alcune applicazioni. Sto facendo qualcosa in mysql ora e mi stavo chiedendo se hanno qualcosa di equivalente a quelli?

Niente di direttamente equivalente, ma puoi simularlo con alcuni (non eccessivamente efficienti) auto-join. Alcuni esempi di codice da una raccolta di query MySQL :

SELECT v1.name, v1.votes, COUNT(v2.votes) AS Rank FROM votes v1 JOIN votes v2 ON v1.votes < v2.votes OR (v1.votes=v2.votes and v1.name = v2.name) GROUP BY v1.name, v1.votes ORDER BY v1.votes DESC, v1.name DESC; +-------+-------+------+ | name | votes | Rank | +-------+-------+------+ | Green | 50 | 1 | | Black | 40 | 2 | | White | 20 | 3 | | Brown | 20 | 3 | | Jones | 15 | 5 | | Smith | 10 | 6 | +-------+-------+------+ 

che ne dici di questo “strumento dense_rank” in MySQL

 CREATE TABLE `person` ( `id` int(11) DEFAULT NULL, `first_name` varchar(20) DEFAULT NULL, `age` int(11) DEFAULT NULL, `gender` char(1) DEFAULT NULL); INSERT INTO `person` VALUES (1,'Bob',25,'M'), (2,'Jane',20,'F'), (3,'Jack',30,'M'), (4,'Bill',32,'M'), (5,'Nick',22,'M'), (6,'Kathy',18,'F'), (7,'Steve',36,'M'), (8,'Anne',25,'F'), (9,'Mike',25,'M'); 

i dati prima di dense_rank () come questo

 mysql> select * from person; +------+------------+------+--------+ | id | first_name | age | gender | +------+------------+------+--------+ | 1 | Bob | 25 | M | | 2 | Jane | 20 | F | | 3 | Jack | 30 | M | | 4 | Bill | 32 | M | | 5 | Nick | 22 | M | | 6 | Kathy | 18 | F | | 7 | Steve | 36 | M | | 8 | Anne | 25 | F | | 9 | Mike | 25 | M | +------+------------+------+--------+ 9 rows in set (0.00 sec) 

i dati dopo dense_rank () come questo, inclusa la funzione “partition by”

 +------------+--------+------+------+ | first_name | gender | age | rank | +------------+--------+------+------+ | Anne | F | 25 | 1 | | Jane | F | 20 | 2 | | Kathy | F | 18 | 3 | | Steve | M | 36 | 1 | | Bill | M | 32 | 2 | | Jack | M | 30 | 3 | | Mike | M | 25 | 4 | | Bob | M | 25 | 4 | | Nick | M | 22 | 6 | +------------+--------+------+------+ 9 rows in set (0.00 sec) 

l’istruzione della query è

 select first_name,t1.gender,age,FIND_IN_SET(age,t1.age_set) as rank from person t2, (select gender,group_concat(age order by age desc) as age_set from person group by gender) t1 where t1.gender=t2.gender order by t1.gender,rank