2009-08-24 4 views
3

오라클에는 rank() 및 dense_rank()와 같은 두 가지 함수가 있습니다. 일부 응용 프로그램에서는 매우 유용한 것으로 나타났습니다. 나는 지금 mysql에서 뭔가를하고 있는데, 그것들에 상응하는 것이 있는지 궁금해하고 있단 말인가?ORACLES rank of MySQL

답변

3

직접적인 기능은 없지만 일부 (매우 효율적이지는 않음) 자체 조인으로 가짜로 만들 수 있습니다. 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

내가 더 나은 솔루션이 있었다 좋겠지 만,이 younes0 @ – giroy

+0

을해야 할 것입니다 순위 3에 넥타이를 매긴 다음 순위 5로 건너 뜁니다. – chaos

+0

@chaos 좋아요. 순위 5로 건너 뛰면 오라클 rank()의 ​​기본 동작이됩니다. – younes0

0

방법이 (

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'); 

데이터 DENSE_RANK 후이

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) 

데이터와 같은 DENSE_RANK()하기 전에 MySQL의에서 "DENSE_RANK 구현"에 대해) "분할 기준"기능 포함

+------------+--------+------+------+ 
| 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) 
당신은 화이트와 브라운을 보면, 당신이 (제대로) 인 것을 볼 수 있습니다 배치 :

쿼리 문은

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