2009-08-24 7 views
3

Oracle hat 2 Funktionen - Rang() und Dichte_Rank() - die ich sehr nützlich für einige Anwendungen gefunden habe. Ich mache jetzt etwas in Mysql und habe mich gefragt, ob sie etwas Ähnliches haben?MySQL Äquivalent von ORACLES rank()

Antwort

3

Nichts direkt äquivalent, aber Sie können es mit einigen (nicht sehr effizienten) Self-Joins vortäuschen. Einige Beispielcode von einem collection of MySQL query howtos:

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 | 
+-------+-------+------+ 
+1

Ich wünsche es eine bessere Lösung, aber diese haben – giroy

+0

@ younes0 tun: Wenn Sie auf Weiß und Brown schauen, sehen Sie, dass es (richtig) ist platzieren ein Unentschieden auf Rang 3, dann überspringen auf Rang 5. – chaos

+0

@chaos okay, also denke ich, dass das Springen zu Rang 5 ist Oracle Rang() Standardverhalten – younes0

0

wie über dieses "DENSE_RANK implementieren" 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'); 

die Daten vor DENSE_RANK() ähnliche

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) 

die Daten nach DENSE_RANK () so, einschließlich "Partition durch" Funktion

+------------+--------+------+------+ 
| 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) 

die Abfrageanweisung ist

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